精华内容
下载资源
问答
  • Access 导入SQL 注意事项

    千次阅读 2016-06-16 15:51:42
    ACCESS改为SQL需要注意哪几个地方  看到别人有时问这个方面的问题。。于是在各网站总结前前辈高人的几点想法,拿来共享: 数据库导入以后,自动增加字段需要重写,所有的数字类型需要增加长度,最好用decimal。 ...

    1,对于日期字段字段

      access表示为:#1981-28-12#

      SQLSERVER2000表示为:''1981-02-12''

      2,SQL语句区别,select ,update 在对单表操作时都差不多,

      但多表操作时update语句的区别ACCESS与SQLSERVER中的UPDATE语句对比:

      SQLSERVER中更新多表的UPDATE语句:

      UPDATE Tab1

      SET a.Name = b.Name

      FROM Tab1 a,Tab2 b

      WHERE a.ID = b.ID;

      同样功能的SQL语句在ACCESS中应该是

      UPDATE Tab1 a,Tab2 b

      SET a.Name = b.Name

      WHERE a.ID = b.ID;

      即:ACCESS中的UPDATE语句没有FROM子句,所有引用的表都列在UPDATE关键字后.

      更新单表时:都为:

      UPDATE table1 set ab='12',cd=444 where ....

      3,delete语句

      access中删除时用:delete * from table1 where a>2 即只要把select 语句里的select 换成delete就可以了。

      sqlserve 中则为: delete from table1 where a>2 即没有*号

      4,as 后面的计算字段区别

      access中可以这样:select a,sum(num) as kc_num,kc_num*num as all_kc_num 即可以把AS后的字段当作一个数据库字段参与计算。

      sqlserver 中则为:select a,sum(num) as kc_num,sum(num)*num as all_kc_num 即不可以把AS后的字段当作一个数据库字段参与计算。

      5,[.]与[!]的区别

      access中多表联合查询时:select tab1!a as tab1a,tab2!b tab2b from tab1,tab2 ,中间的AS可以不要。

      sqlserve 中则:select tab1.a as tab1a,tab2.b tab2b from tab1,tab2 ,中间的AS可以不要。

      6,联合查询时,

      access中多表联合查询:'select a,b from(

      select a,b from tab1 where a>3 union select c,d from tab2 ) group by a,b

      sqlserve 中则'select a,b from(

      select a,b from tab1 where a>3 union select c,d from tab2 ) tmptable group by a,b即要加一个虚的表tmptable,表名任意。---

      7,access升级到sqlserver时,

      可以用sqlserver的数据导入工具导入数据,但要做必要的处理。

      access中的自动编号,不会自动转换SQL中的自动编号,只能转换为int型,要把它手工改成标识字段,种子为1,把所有导入被sqlserver转化成的以n开头的字段类型的n去掉,如nvarchar->varchar.把需要有秒类型的日期字段改成datatime类型(SQL会把所有的日期开转化成smalldatetime型)

      8,true与1=1

      access用where true表示条件为真,

      sqlserver用where 1=1表示条件为真

      9,判断字段值为空的区别

      普通空:

      Access和sql server一样 where code is null 或 where code is nol null

      条件空:

      Access:iif([num] is null,0,[num]) 或 iif([num] is null,[num1],[num])

      SQLServer: isnull([num],0) 或 isnull([num],[num1])

      10,SQL语句取子串的区别

      access:MID(字段,n1,[n2]),LEFT(字段,n),RIGHT(字段,n)

      如:select left(cs1,4)+'-'+cs2 as cs3

      SQLServer: SUBSTRING(expression, start, length)

      如:select substring(cs1, 1, 2) + substring(cs1, 4, 2) + '-' + cs2 as cs3

      附:如何发布基于ADO+SQL SERVER的应用

      很多朋友在问如何发布基于ADO+SQL SERVER的应用程序,笔者作了测试,如下:

      Win98访问xp或2K的SQL SERVER 2000服务器,不用任何SQL的DLL文件,只要保证98能与其它工作组里的机子正常通信(能访问另外一台机子里的共享文件),这一步是保证98安装了这三个协议,TCP/IP,SPX/IPX,NETBEUIDG三个协议,

      我的测试环境是,98se+xp,98se只安装了必要的驱动程序,其它的程序一个也没有装(专门装来测试这个的)

    ------------------------------------------------------------------------------------------------------------------------------
    表名不能是User
    字段名不能是PassWord


    ----------------------------------------------------------------------------------------------------------
    将使用Access的论坛迁移到SqLServer中 



    利用动网提供的论坛程序创建了一个内部论坛。原来,这个论坛是发布在windows2000的IIS5上的。他的数据库用的是Access。可是,当我将这个论坛迁移到windows2003上以后,发现经常死掉。到网上找了一下,并且咨询了微软的工程师,很多人都认为i这跟他使用Access有关。并且,我想在公司内部网站首页增加一个跑马灯来显示论坛中的新帖子,可是,如果继续用Access的话,访问起来不是那么方便。于是决定迁移到SQl中。

    第一步:将数据导入SQL Server
    进到SQL Server企业管理器,新建一个数据库,然后,选择导入数据,选择Access数据库作为导入源,导入所有的数据。
    第二步:修改数据表
    通过这种方式建立的数据表,是没有主键和默认值的,参照原来的Access库修改各个表。(这个比较烦,但是一定得做,因为后面的程序中会用到这些默认值)
    第三步:修改程序

    将站点迁移到相应的服务器,创建新的站点。首先,要改的就是数据库联接.由于Access中的一些函数和SqL中的一些函数不一样,所以,程序会报错,根据程序的报错信息修改相关的地方。这里主要要修改两个地方:

    SqL语句中的Now()函数:
    在Access中使用Now()函数来获取当前时间,而在SQL Server中用Getdate()函数来获取当前时间。但是,由于原来的程序是采用vb Script写的,VbScript中也采用Now()函数获取当前时间,所以要小心Sql语句中的Datediff函数的第一个参数:

    在Access中DateDiff的第一个参数用引号,并且只用一个字母来表示比较的部分,而在SqLServer中不需要引号,并且用全称和或者简称来表示,并且简称也是两个字母的。

    改完后逐项测试,改正所有的错误(都挺简单的)。

    程序就可以正常使用了,前后时间可能花了4个多小时吧。

    我想到以下几点:
    1、如果,我们要使用Access数据库,为了以后迁移方便,我们应该尽量避免使用数据库的函数,而是多用程序语言的函数,在SQL语句的外面解决计算问题。如果,不能避免要使用这些数据库函数,我们也应该在代码中设置明显的注释标记,以便于以后迁移。
    2、我们在设计程序时候,要充分考虑数据库的迁移的需要,在插入语句、查询语句等语句的时候要尽量采用标准的SqL语法,并且要不厌其烦得插入默认值,而不要依赖数据库提供默认值,这样做,对以后的改进可能会有好处。



    ACCESS改为SQL需要注意哪几个地方 



    看到别人有时问这个方面的问题。。于是在各网站总结前前辈高人的几点想法,拿来共享:

    数据库导入以后,自动增加字段需要重写,所有的数字类型需要增加长度,最好用decimal。

    所有的默认值都丢失了。主要是数字类型和日期类型。

    所有now(),time(),date()要改成getdate()。

    所有datediff('d', time1, time2)要改成datediff(day, time1, time2)

    有可能一些true/false类型不能使用,要变为1/0。

    备注类型要通过cast(column as varchar)来使用。

    CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。

    isnull(rowname)要改成rowname = null

    ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!

    转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。

    对此两种数据库进行操作的sql语句不全相同,例如:在对ACCESS数据库进行删除纪录时用:"delete * from user where id=10",而对SQL SERVER数据库进行删除是用:"delete user where id=10".

    日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQL SERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。

    在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQL SERVER数据库处理中,却不能用。

    =====================

    Access中的Join查询:要求字段不能是Memo类型或OLE类型,否则报以下错误:

    =====================

    Access 导入SQL 注意事项 - 似水无痕 - 用友软件

    展开全文
  • CAD模型导入Pointwise网格导入Fluent的联合设计教程(二维后台阶模拟) 这次写一篇关于怎样利用cad模型来进行fluent计算的教程,中间利用到了pointwise划分结构性网格。由于我看网上pointwise划分网格的教程并不多,...

    CAD模型导入Pointwise网格导入Fluent的联合设计教程(二维后台阶模拟)

    这次写一篇关于怎样利用cad模型来进行fluent计算的教程,中间利用到了pointwise划分结构性网格。由于我看网上pointwise划分网格的教程并不多,所以也附带对Pointwise部分写的详细一些。

    0.问题引出

    这个后台阶流动是流体力学研究的常见模型之一,可以用来研究流动分离。
    看这个教程的应该对这个问题本身都有所了解,这个也不是教程的重点,就直接跳过吧。

    1.CAD模型绘制

    这里我选用的模型尺寸为台阶长0.2m,高0.1m,流场为矩形流场,长1.2m,高0.3m。气流从左边吹入,右边流出。在CAD模型的绘制如下:
    在这里插入图片描述
    这里注意两点:

    1、CAD里尺寸默认为mm,但是绘制的时候要按照米的数值绘制,即就是0.2。看起来会有点小。如果这里输成了200,也没有关系,在pointwise导入的时候可以更改单位,在fluent里依然可以更改放缩比。这里我第3节第4节都会提到。

    2、流场被划分成了3个区域,目的是为了建立3个矩形网格区域,方便绘制。这3个区域的线条最好不要有重叠、重复或者一根线条贯穿多个区域。比如,这个模型有10根线条,检查一下:每个网格区域有4根线条,其中有2根线条重叠再删去,得到3×4-2=10,刚好满足。

    之后画好之后,点击输出,然后选择iges格式即可。

    2.Pointwise网格绘制

    这里pointwise以及后面的fluent文件最好都保存在路径全部是英文的地方。

    打开Pointwise,我这里用的是18.1。

    先说一下操作,Shift右键是移动,Ctrl右键是旋转,鼠标管轮是缩放,Ctrl滚轮是平面旋转。如果被玩坏了,可以到右侧选择相应视图即可,对于2维模型选择-Z轴。
    导入cad文件,点击左上角File-Import-Database,选择刚才cad输出的iges或者igs文件。左边单位Units选择From File。直接选择ok,yes一路确定,成功导入模型。
    在这里插入图片描述
    之后1左边全选Datebase里的元素,2转换成connectors元素。方法如下:
    在这里插入图片描述
    成功转换成Connectors线条后,可以在左边元素列表里看到他们。之后为了划分网格,我们需要告诉每个边界上的网格数目,利用边界网格绘制面网格。对于4矩形区域的网格和矩形的变体,我们要保证对边线网格点数相等的原则。

    首先先划分上表面的网格,设定网格数量为50,如下图所示
    在这里插入图片描述
    在Pointwise内,1按住Ctrl键,选择相应的Connectors线条,2输入网格点数,然后Enter回车。注意这里输入50代表划分了50个点,49个间隔(即网格),如果之后遇到多线段组合的边界时要注意保持间隔相加和对边相等,而不是点相等。
    在这里插入图片描述

    其它线条同理,最终网格的划分如下:
    在这里插入图片描述
    然后依次选择网格区域进行划分,操作为1选定网格区域的4条边,2选择结构网格划分。
    在这里插入图片描述
    之后和上一步一样,将3个区域的网格全部画好。

    下一步我们开始进行网格分布。由于流体有边界层,所以需要在靠近壁面的地方设置比较密的网格。比如上面的网格区域,需要在下表面设置比较密的网格。计算y方向网格密度,为0.3/49=0.0061,我们考虑将边界层最内侧网格设置为0.001。
    所以1更改选择模式,2选择线段加密的方向,3然后将最内侧网格大小设置为1e-3。操作见下图
    在这里插入图片描述
    之后同理加密相应地方即可。网格画好之后,点击上面的Start Solve还可以进行网格的自动优化,用Stop Solve停止,一键式操作非常方便。
    fluent计算要求网格扭曲度要小,即网格最好是矩形而不是斜四边形;要求变化比率要小,即相邻网格之间面积不能差太多;还要求物体壁面有合适的边界层。pointwise有很好的网格质量检测功能,详细的可以去B站学习。

    3.Pointwise的CAE导出

    这个步骤是能否被fluent读取的关键。

    1.CAE求解器
    单击CAE-Solver进入求解器选择界面
    默认是CGNS,往上翻选择ANSYS FLUENT即可。

    2.维数设置
    这个是2维的,选择CAE-SetDimension-2D

    3.边界设置
    点击CAE-Set Boundary Conditions进入边界设置
    这个模型有4个边界:inlet,outlet,wall和symmetry(中心线)
    点击4下new,进入边界设置
    在这里插入图片描述
    选择新建的边界,比如bc-2,然后依次选择3条边作为该边界条件,然后把bc-2前面对应的对勾打上,即完成了这一边界条件的设置。后面的几个也同理。最后的形式是第一行没有边,后面几行依次对应对应相应边界条件,最后一列的id号从1至4,如果是这一形式就表示没有问题了(如果想改bc-2的名字,双击bc-2即可)。

    4.流体设置
    选择CAE-Set Volume Conditions
    和上面边界条件一样,由于流场为流体流场,所以这里只能设置一个属性Fluid。
    点击一次New,然后选择3个区域网格,转换成Fluid。

    5.正体积设置
    选择3个面,然后点击Edit-Orient。
    这里要求向量指向z轴的正方向,通过左边的Reverse来进行方向的调整。
    在这里插入图片描述
    比如上图经过调整就是我们希望的网格。也可以通过右手法则判断向量,即利用红箭头和黄箭头来判断橘色箭头的方向。最后别忘记点击ok。

    如果存在指向z轴负方向的网格区域,fluent会因为负体积网格而报错。

    6.输出CAE为cas格式
    选择所有的面网格区域(Domains),选择File-Export-CAE
    输入文件名称即可保存。

    4.Fluent的CAE读取

    打开fluent,选择2D模式,不要双精度,工作目录我就直接选择上边pointwise创建的工作目录。
    打开fluent成功之后,选择File-Read-Case,选择上一节创建的cas文件即可。
    观察下面的比例标尺,尺寸正确无误。左侧Set Up-Boundary Condition的边设置,Cell Zone Condition流体设置无误。大功告成,可以证明我们的CAE导入是成功的。
    之后设置边界条件,设置求解器求解方法之类的,然后计算就行了。

    如果检查之后发现单位错误,或者比例错误,这里还有最后一次改正的机会。
    选择Scale-Scaling-Specify Scaling Factor,输入缩放因子即可对模型进行缩放。

    关于fluent求解之类的由于有太多教程我就不写了。

    展开全文
  • ​ 首先,必须先和数据库建立一个传输数据的连接通道,需要用到pymysql下的connect()方法 ​ pymysql.connect() 方法返回的是Connections模块下的Connection 实例,connect() 方法传参就是在给Connection类的 _...

    #### pymysql

    ​ pymysql 的语法兼容MySQLdb,是使用Python写的

    ​ pymysql 是可以远程连接数据库并对数据库中的数据进行操作的工具

    pymysql是使用

    • ​ 首先,必须先和数据库建立一个传输数据的连接通道,需要用到pymysql下的connect()方法

      ​ pymysql.connect() 方法返回的是Connections模块下的Connection 实例,connect() 方法传参就是在给Connection类的 _init_ 初始化魔术方法参数,也可以理解为 connect() 方法就是在创建新的 Connetion 类

      connect() / Connection初始化 常用参数 说明
      host 主机ip
      user 用户名
      password 密码
      database 数据库
      port 端口号
      charset 字符集

      ​ 例如:

      db = pymysql.connect(host='localhost', 
                    user='root',
                    password='123456', 
                    database='userinfo',   # 所用的数据库名
                    charset = 'utf-8')
      

    - ​ 在使用pymysql.connect() 方法与数据库建立连接后,想要操作数据库时,就需要使用游标 Cursor

    ​ 通过连接好的数据库(此处为db)调用 cursor() 方法即可返回一个新的游标对象,在连接没有关闭之前,游标对象可以反复使用

    cursor = db.cursor()
    

    - ​ 数据库操作需要使用Cursor类的实例(即通过 db.cursor() 创建的 cursor 游标对象)提供的 execute() 方法,执行SQL语句,成功则返回结果

    ​ 例如:插入操作

    sql = "insert into user_pwd(username,password) values('vera', '1234')" 
    cursor.execute(sql)
    

    - 这里插入数据的时候插入的表名有个需要注意的地方,插入表名的时候最好带着库名,例如:
    sql = "insert into database.table(username, password)  values('xxx', '123')"
    

    否则可能会出现如下错误:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax

    具体可以参考我的另一篇文章:pymysql中cursor.execute()执行insert into的坑及解决方法

    - 查询操作

    sql = "select * from table"
    response1 = cursor.execute(sql)
    response2 = cursor.fetchall()
    

    这里单独说一下查询操作

    这里有两个response返回,
    response1是对cursor.execute(sql) 的返回数据接收,这个返回可能并不是你想要的返回值,因为它返回的是查询到的个数,是个int类型的数字
    而我想response2才是你想要的返回
    response2是调用了fetchall方法:查询时获取结果集中的所有行,一行构成一个元组,然后再将这些元组返回(即嵌套元组)
    还有一些别的方法如下
    ||| (这是个箭头)
    V

    • 获取查询结果集的方法

      ​ 当调用 cursor.execute(sql) 方法查询数据的时候,如果执行成功,获取查询的结果集的方法有

      名称 说明
      fetchone() 获取结果集的下一行
      fetchmany(size=None) size指定返回的行数,None则返回空元组
      fetchall() 返回剩下的所有行,如果走到末尾,就返回空元组,否则返回一个元组,其元素是每一行的记录封装的一个元组
      cursor.rownumber 返回当前行号.可以修改,支持负数
      cursor.rowcount 返回的总行数

      ​ 注意: fetch操作的是结果集,结果集是保存在客户端的,也就是说fetch的时候,查询已经结束了

    • ​ Connection类提供了三个方法: begin 开始事务, commit 提交事务, rollback 回滚事务,如果通过 sql 语句对数据库中的数据进行了修改, 则需要提交事务。

      db.commit
      

    - ​ 释放资源,在程序结束时需要建立的连接即建立的游标资源释放掉,避免资源的浪费,可以调用close() 方法
    if conn:
        conn.close()
    if cursor:
        cursor.close()
    
    • ​ 在执行查询操作的时候要尽量避免 使用%s 或者 format() 的字符串替换操作,这样是为了避免sql注入的发生

      ​ sql 注入指:字符串替换操作中如果出现了 如下操作时,返回的结果将是全部数据

      sql = "select * from table where id={}".format('5 or 1=1')
      

      ​ 字符串替换的方式将会让攻击者有机可乘,攻击者猜测后台数据库的查询语句使用的拼接字符串等方式,从而经过设计为服务端传参,令其拼接处特殊字符串的SQL语句,返回攻击者想要的结果,所有,永远不要相信客户端传来的数据是规范及安全的!

      ​ 解决此问题的方法:

      ​ 参数化查询,不仅可以有效的防止注入攻击,还可以提高查询的效率

      cursor.execute(query,args=None)
      

      ​ args必须是元组 列表或字典,如果查询字符串使用%(name)s,就必须使用字典.

      ​ 例如:

      sql = "select * from table where name like %s and age < %s"
      cursor.execute(sql,('tom%',25))
      
      或者
      
      sql = "select * from table where name like %(name)s and age < %(age)s"
      cursor.execute(sql,{'name':'tom%','age':25})
      

      ​ 参数化查询提高了效率,原因是–SQL语句缓存.
      ​ 数据库服务器一般会对SQL语句编译和缓存,编译只对SQL语句部分,所以参数就算有SQL指令也不会被当作指令执行.
      ​ 编译过程,需要词法分析、语句分析、生成AST、优化、生成执行计划等过程,比较耗费资源。
      ​ 服务端会先查找是否对同一条查询语句进行了缓存,如果缓存未失效,则不需要再次编译,从而降低了编译的成 本,降低了内存消耗。
      ​ 可以认为SQL语句字符串就是一个key,如果使用拼接方案,每次发过去的SQL语句都不一样,都需要编译并缓存。 大量查询的时候,首选使用参数化查询,以节省资源。


    - ​ 上下文管理: 不关闭游标对象cursor 和 数据库对象db,就可以接着用,连接(db)应该不需要反反复复创建销毁,应该是多个cursor共享一个db.

    ​ 例如:

    import pymysql
    
    db = pymysql.connect(ip,user,password,database,port)
    
    with db.cursor() as cursor:
        sql = "select * from table where id=%s"
        cursor.execute(sql,5)
        print(cursor.fetchall())
        
    cursor.close()
    db.close()
    
    展开全文
  • websocket导入进度条

    千次阅读 2016-11-01 16:08:43
    导入的时候读取当前导入的总条数。  c.当每插入总数的1%数据时发送一个进度回前端,前端渲染该进度,直到100%完成。 注意:每一次数据传输websocket都会新建一个通道,发送一次ws请求,在请求完成后...

    1.封装websocket公用类

    function websocket(){
    	this.socket = null;
    	this.code = new Date().getTime()+""+Math.floor(Math.random() * ( 1000 + 1));
    	this.options = {
    		url:getWsPath,
    		dataType:"json",
    		onmessage:function(msg){
    			return msg;
    		},
    		onopen:function(msg){
    			return msg;
    		},
    		onclose:function(msg){
    			return msg;
    		},
    		onerror:function(msg){
    			return msg;
    		}
    	};
    }
    websocket.prototype.init = function(options){
    	//判断当前浏览器是否支持WebSocket  
    	if (!window.WebSocket) {  
    		window.WebSocket = window.MozWebSocket;
    	}
    	if(window.WebSocket){  
    		this.socket = new WebSocket(getWsPath()+"/"+this.code);
    	}else{
    		$CommonUI.alert('当前浏览器 不支持 websocket');  
    		return;
    	}
    	
    	//如果存在配置信息
    	if(options){
    		//初始化默认属性
    		options = $.extend(this.options,options);
    		
    		//连接发生错误的回调方法  
    		this.socket.onerror = function (event) {  
    			options.onerror(event.data);
    		};  
    		 
    		//连接成功建立的回调方法  
    		this.socket.onopen = function (event) {  
    			options.onopen(event.data); 
    		}  
    		 
    		//接收到消息的回调方法  
    		this.socket.onmessage = function (event) {  
    			//当返回配置为json的时候则配置为json
    	    	if(options.dataType=="json"){
    	    		options.onmessage($.parseJSON(event.data));
    	    	}else{
    	    		options.onmessage(event.data);
    	    	}
    		}  
    		
    		//连接关闭的回调方法  
    		this.socket.onclose = function (event) {  
    			options.onclose(event.data);
    		} 
    		
    		//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。  
    		window.onbeforeunload = function () {  
    			if(this.socket){
    				this.socket.close();  
    			}
    		}
    	}
    }
    
    //发送消息
    websocket.prototype.send = function(msg){
    	if (!window.WebSocket) { return; }
        if (this.socket.readyState == WebSocket.OPEN) {
        	if(typeof msg == "string"){
        		this.socket.send(msg);
        	}else{
        		msg["code"] = this.code;
        		msg.paramsIn = JSON.stringify(msg.paramsIn);
        		this.socket.send(JSON.stringify(msg));
        	}
        } else {
            $CommonUI.alert("连接没有打开!");
        }
    };
    
    //获取websocket路径
    function getWsPath(){
    	var host = window.location.host;	//主机IP:port
    	var path = window.document.location.pathname;//端口后的路径
    	var projectName = path.substring(0,path.substr(1).indexOf("/")+1);//项目名
    	return "ws://"+host+projectName+"/websocket";
    }

    2.前端调用websocket

    var websocket = new websocket();
    websocket.init({
    	onmessage:function(msg){
    		$CommonUI.getProgressBar('#importProgress').progressbar('setValue', msg);
    	}
    })

    3.后端websocket的支持

    package com.dhcc.isccore.common.websocket;
    
    import java.io.IOException;
    import java.util.concurrent.ConcurrentHashMap;
    
    import javax.websocket.OnClose;
    import javax.websocket.OnError;
    import javax.websocket.OnMessage;
    import javax.websocket.OnOpen;
    import javax.websocket.Session;
    import javax.websocket.server.PathParam;
    import javax.websocket.server.ServerEndpoint;
    
    import com.dhcc.isccore.dto.websocket.WebsocketDto;
    
    @ServerEndpoint("/websocket/{code}") 
    public class WebSocketListen {
    	
    	//用于记录接入的websocket连接
    	private static ConcurrentHashMap<String,WebsocketDto> websocketMap = new ConcurrentHashMap<String,WebsocketDto>();
    	
        /** 
         * 连接建立成功调用的方法 
         *  
         * @param session 
         * 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 
         */  
        @OnOpen  
        public void onOpen(@PathParam("code") String code,Session session) {  
        	WebsocketDto websocketDto = new WebsocketDto();
        	websocketDto.setCode(code);
        	websocketDto.setSession(session);
        	websocketMap.put(code, websocketDto);
        }  
      
        /** 
         * 连接关闭调用的方法 
         */  
        @OnClose  
        public void onClose(@PathParam("code") String code) {  
        	websocketMap.remove(code);
        }  
      
        /** 
         * 收到客户端消息后调用的方法 
         *  
         * @param message 
         * 客户端发送过来的消息 
         * @param session 
         * 可选的参数 
         */  
        @OnMessage  
        public void onMessage(String message, Session session) {  
        }  
      
        /** 
         * 发生错误时调用 
         *  
         * @param session 
         * @param error 
         */  
        @OnError  
        public void onError(Session session, Throwable error) {  
            error.printStackTrace();  
        }
        
        //发送消息
        public static void sendMessage(String code,String message) throws IOException {  
        	Session session = websocketMap.get(code).getSession();
            session.getBasicRemote().sendText(message);  
        }  
    
    	public static ConcurrentHashMap<String, WebsocketDto> getWebsocketMap() {
    		return websocketMap;
    	}
    
    	public static void setWebsocketMap(ConcurrentHashMap<String, WebsocketDto> websocketMap) {
    		WebSocketListen.websocketMap = websocketMap;
    	}
    }
    

    注意:1.websocket只支持get请求;
               2.websocket可以通过@PathParam(参数名)获取到请求传递的参数;
               3.参数名实在@ServerEndpoint中通过{参数名}定义的。

    这里使用传入的code唯一标识一次请求,其他地方可根据该code获取到当前session并发送消息到前台。

    4.Websocket定义

    package com.dhcc.isccore.dto.websocket;
    
    import javax.websocket.Session;
    
    public class WebsocketDto{
    	/**  
    	* 字段:      字段名称
    	* @Fields serialVersionUID : TODO 
    	*/
    	private String	code;		//客户端传入的唯一标识
    	private int totalNum; 		//总数量
    	private int handleNum = 0;		//当前操作数量
    	private Session session;	//当前websocket的session
    	
    	public int getTotalNum() {
    		return totalNum;
    	}
    	public void setTotalNum(int totalNum) {
    		this.totalNum = totalNum;
    	}
    	public int getHandleNum() {
    		return handleNum;
    	}
    	public void setHandleNum(int handleNum) {
    		this.handleNum = handleNum;
    	}
    	public String getCode() {
    		return code;
    	}
    	public void setCode(String code) {
    		this.code = code;
    	}
    	public Session getSession() {
    		return session;
    	}
    	public void setSession(Session session) {
    		this.session = session;
    	}
    }
    

    5.后端返回进度

    <pre name="code" class="java">//websocket开始
    WebsocketDto webSocketDto = WebSocketListen.getWebsocketMap().get(code);
    int handleNum = webSocketDto.getHandleNum();
    handleNum = handleNum + i;
    String progress = (int)(handleNum*100/webSocketDto.getTotalNum())+"";
    WebSocketListen.sendMessage(code, progress);
    //websocket结束
    
    这里i是本次插入数据库的数据量

    6.进度条设计原理

      a.初始化定义一个长连接的websocket,用于更新进度。
      b.当导入的时候读取当前导入的总条数。
      c.当每插入总数的1%数据时发送一个进度回前端,前端渲染该进度,直到100%完成。

    注意:每一次数据传输websocket都会新建一个通道,发送一次ws请求,在请求完成后自动关闭该websocket连接。


    展开全文
  • 本次学习一个四层核心板,CPU为BGA封装,使用菊花链拓扑布线,由于核心板上SDRAM传输速率较高,因此在本设计中使用了等长布线。为了方便复习将主要步骤和技巧记录一下。
  • 交易记录表设计注意

    千次阅读 2017-02-28 16:33:40
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: ...导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
  • Allegro PCB导入网表错误

    千次阅读 2020-04-07 10:19:04
    利用Cadence16.6软件进行电路板的设计时,从PCB到原理图的过程中,可能会遇到网表导入失败的问题。今天我也遇到了一种情况,这里将问题及解决办法分享给大家,如有相同问题,希望能帮助到你。 1、问题描述 在...
  • SQL(创建新表导入数据)

    千次阅读 2019-06-13 08:47:19
    创建新表导入数据 1 在数据库中创建一个新的数据库,命名。 2 命名之后在数据库文件选择路径,两个都要确定。 3 在新建的数据库中新建一个表,添加所需要的数据后, ...文件路径根据文件所在的地方; 然后是...
  • DDR4新增了许多功能,这对于我们之前信手拈来的内存PCB设计又带来了一些新的挑战,虽然说之前的一些规范可以用,但还是有很多不一样的地方,如果依然按照之前的设计方法来做,说明你还不了解DDR4,一准入坑。...
  • solr DataImportHandler 导入数据

    千次阅读 2017-07-25 14:55:08
    的方式向solr导入数据,可以一次全部导入,也可以增量导入。  概览  目 标  能够读取关系数据库中的数据。 通过可配置的方式,能够将数据库中多列、多表的数据生成solr文档 能够通过
  • 多种方法实现Excel批量导入数据库

    万次阅读 热门讨论 2015-11-27 23:24:19
    Excel批量导入数据库是用到批量导入系统的一个难题,特别是需要批量导入的Excel表比较复杂,或者这张Excel表需要多表插入的时候,批量导入就变得复杂起来。其实了解了批量导入的原理之后,批量导入也就不再复杂。 ...
  • 我就不凑热闹了,我来聊聊 Go 1.16 中关于 go get 和 go install 你需要注意地方。 目前 Docker 官方镜像尚未发布,我是本地构建了个镜像来使用。 (MoeLove) ➜ go version go version go1.16beta1 linux/...
  • 美中不足的地方是对于单个字段的调整不是很灵活,需要点开表,找到列点来点去的调整,不能快速的ctrl c ctrl v,而且查找也不是很方便,这种时候就想到了用Excel来维护表结构,在Excel先定义好表的各个字段名,含义...
  • 步骤描述完了,我们看看有哪些值得注意地方。 currentBuffer 首先自然要说下currentBuffer,如果200ms期间你从Kafka接受的数据足够大,则足以把内存承包了。而且currentBuffer使用的并不是spark的storage...
  • 对于普通Web应用后端的开发,常常会借助一些成熟的框架,例如SpringMVC,游戏的服务器区别于此的特点是:游戏服务器需要有比较大的吞吐量,而且通常为Socket长连接,所以需要一个分布式架构。当前比较流行的网络通信...
  • Mysql 大量数据快速导入导出

    万次阅读 2017-02-07 21:24:36
    项目中需要对数据库中一张表进行重新设计,主要是之前未分区,考虑到数据量大了以后要设计成分区表,同时要对数据库中其他表做好备份恢复的工作。 【实验环境】 MySQL版本:mysql-5.6.19 操作...
  • 史上最全的立创元器件封装库导入AD详细教程 立创EDA 立创商城 打开立创商城网站https://www.szlcsc.com/ 步骤 搜索元器件 例如搜索STM32F103C8T6芯片 查看搜索结果,寻找下载文件 点击下载文件链接 出现如下图片...
  • 蓝牙设计

    万次阅读 热门讨论 2013-05-31 17:10:26
    蓝牙设计   1. 问:什么是蓝牙通信? 答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在...如果单纯是金钱,从事技术是不太可能暴富的(注意比尔.盖茨是个技术商人);
  • Tensorflow:TF模型文件(checkpoint文件夹下ckpt文件之data、index、meta)保存、模型导入、恢复并fine-tuning之详细攻略 目录 保存TF训练好的模型 1、Tensorflow模型文件之checkpoint文件夹下ckpt的data、...
  • Mysql导入数据load data infile

    千次阅读 2013-07-28 14:45:40
    mysql有一个高效导入方法,那就是load data infile 下面来看案例说明   基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ignore] into table tbl_name [fields [terminated by't'...
  • 源blog:... 今天同事问起MySQL导入txt文件...用mysqlimport 工具。~帮忙调试。。。。自己测试通过 mysqlimport -u root -padmin -d --fields-terminated-by=, depot a.txt 说明
  • 蓝牙4.0设计 CC2540

    万次阅读 热门讨论 2013-10-10 22:35:45
    答:蓝牙通讯最初设计初衷是方便移动电话(手机)与配件之间进行低成本、低功耗无线通信连接,现在已经成为IEEE802.15标准,得到全球上万家厂商支持。   2. 问:如果从事蓝牙开发有没有前途? 答:严格地说,这...
  • 下面要讲的,是我如果一步步将SystemUI导入到AndroidStudio的。 (备注:本文所讲内容... 修改系统相关模块的代码,如果是小的修改还好,如果是需要改动比较多,那能将源码导入到AndroidStudio来修改是最好不过的...
  • Solr的data-config.xml导入数据库记录

    千次阅读 2018-12-20 22:09:14
    当我们要从数据库中导入数据到solr的索引库中,就需要自己配置data-config.xml文件来引入记录 dataconfig.xml的创建 首先在solrhome的core的conf文件夹加新建data-config.xml,并添加如下类似内容: &amp;lt;?...
  • 怎么讲access数据库导入sql2005数据库啊?谢谢各位大虾了 如果有教程更好!sql2005不是有导入向导吗?按照步骤即可安装好SQL Server 2005 Express后,再安装SQL Server Management Studio Express CTP就可以很方便的...
  • 1. 概述  大多数的应用程序将数据存储在关系数据库(例如oracle、mysql、sql service等等...对于这样的应用如果技术选型是Solr,就需要把数据从关系型数据库导入到solr服务器,为了解决这个问题,Apache提供了DataI
  • 注意我们在一个组件中通过导入引用了其它组件,也可以称之为父子组件,但想要通过 控制子组件的显示,则需要进行路由的相关配置。 打开 router/index.js ,修改代码如下 import Vue from 'vue' ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,191
精华内容 26,876
关键字:

导入设计需要注意的地方