本人做vb有6、7年了,做了一套c/s的系统,后台用sql,主要有以下问题:
1、如果网络较慢或者连接数较多,数据库操作就会很慢很慢,界面假死。
2、时间久了,服务端的sql占用内存可达到1g以上
3、oledb直连数据库,需要开放1433端口
我推测的原因如下,请各位指教:
1、直连数据库对网络质量要求比较高,比较耗资源,连接必须保持到数据完全返回客户端,数据库经常处于等待状态,效率低下,因此速度慢,web就不同了,直接操作本地数据库,发送结果到浏览器,即使网络慢,顶多多了显示的时间,数据连接执行完查询就关闭了。
是不是每一个客户端的连接,数据库就会生成一个新的连接池,所以客户端连接多了,内存将耗用很厉害,进一步拖慢速度。
2、内存占用大,也是连接池太多的问题,如果是三层的或者web的,那么可能就只有一个连接池?
3、直连1433端口没办法,没有三层的通病
设想的解决办法:
1、用asp.net重写,这个方法太笨了,不得已为之。
2、使用三层开发,工作量也不小,而且据网上搜索了解,vb开发三层不太适合,com+部署不可靠,中间层和数据库放在一起速度也有影响(但我不知道这个影响有多大?有做过的说说?)
3、用socket通讯,这个方法不知道是不是我的发明,也许早就有了,也许异想天开,我觉得如果可行的话,这个是最简便的方法,只需要逐步的把现有的客户端逻辑移植到服务端即可,速度也会随之逐步提高,比如:
登录操作:
客户端socket发送:客户端id,用户名+密码,登录命令
服务端收到后回复:登录结果
客户端收到后:显示登录结果
这里在客户端发送命令道客户端收到服务端结果这段时间内,客户端需要等待,这个等待怎么处理?用循环吗?太耗资源了。还是什么都不做,登录按钮只发送登录请求,在socket里面写select case,case 登录的时候,调出主界面,如果这样所有操作都这样做,这个select case岂不很夸张的大?这点不甚了了
如果用socket,还有一个问题,就是网络的延时问题,比如我发送了删除命令,又发送了查询命令,由于网络问题,先返回了查询结果,然后才返回删除结果,甚至丢包了,会不会有这种情况,又如何处理?
请指教

解决方案 »

  1.   

    你的系统有多少客户端同时运行?
    每次查询的数据量有多大?
    通过odbc连接sql,可以设置不同端口的啊三层,VB太麻烦了socket实现工作量也不小
      

  2.   

    不知道你连了多少个客户端
    不超过100个应该没什么问题
    正规一点的是采用第三种方案,自己使用socket做个服务端
      

  3.   

    后台用sql,ACCESS比aql哪个比较好一点?
      

  4.   

    是不是数据流量太大的缘故,我做cs连接跟lz描述比较接近的工程,很多时候都超过500个连接也没有感觉很慢啊。
      

  5.   

    楼主的SQL服务器不会是普通的计算机吧
    还有,你不会每个客户端都有一个连接一直与SQL服务器连着吧
    还有是不是SQL服务器有什么配置不正确啊
      

  6.   

    数据库都是随手断开的
    rs.close
    set rs=nothing
    conn.close
    set conn=nothing
      

  7.   

    查询和添加等操作完毕都应该关闭连接!
    不只是速度,也为了安全数据库都是操作后断开的
    rs.close
    set rs=nothing
    conn.close
    set conn=nothing不要用控件编程,都用引用
      

  8.   

    在部署数据库服务器的时候就应该事先考虑到用户数量多的情况,所以硬件方面应该注意到内存的配置,系统方面的优化也是不可少的,专用的服务器(比如数据库服务器)其它不需要的后台服务可以关闭的关闭, 不需要自动运行的软件都禁止,可以节省不少内存.
    光只是数据库随用随关也不见得就能提高性能,毕竟连接数据库也会占用大量通讯带宽,在数据表的记录数比较多的时候建立连接也是花费不少时间的,特别是在VPN接入的时候对系统的拖累尤为突出.
    因此还是具体问题具体分析, 楼主应该仔细得分析项目的各项事宜,从服务器到网络到应用.尽量减少不必要的内存驻留和流量占用,相信可以带来不小的提高.
      

  9.   

    "数据库不应常连,随用随连,用后断开"
    这是谁的说法,做C/S结构的应用软件,没有这样的说法,认为这样会速度快只是看表面现象,可能是受了ASP这个 B/S结构的影响,ASP随用随连,用后断开是没有办法,没法常连才这样的,速度慢还是软件设计上有问题吧,设想来下,100个用户在操作软件的时候,不停地断开,然后又不停在连接,一会服务器就要不动了
      

  10.   


    支持,这几天我一个项目用ActivexExe多线程,感觉挺好的!
      

  11.   

    SQL SERVER服务器设置与SQL SERVER
    数据库设置似有问题,照你所说已经存在
    内存泄漏问题。
      

  12.   

    本人也有个正在使用的网络版软件。一开始局域网内速度快,放到服务器上速度慢。本人经验,希望对你有帮助:
    1、查询时,尽量只返回必需的字段2、常用不常修改的典表,可软件启动时一次性加载到动态数组变量中。再做个自定义带变量函数来取读取。public function getEmployeeName(id)
    dim i as integer
    for i=0 to ubound(aryEmployeeID)
      if aryEmployeeID(i)=id then
        getEmployeeName=aryEmployeeName(i)
        exit sub
      end if
    next
    '无匹配时,可重新加载数数组再判断一次
    end function 3、使用存储过程,对于读取的数据量不太的内容,列如上面的员工表,可用存储过程把每个一用户信息串起来到字符串变量中,读取数据时只返回一条记录,本地再用split分出来,速度n快。4、使用分页,分页:
    可不是select 所有所需字段 from 表
    而是先select id from 表,然后把当前页的id 串起来
    然后再用select 所有所需字段 from 表 where id in(0,1,3……)
    当然,这里再结合第2点5、第4点再优化:
    如果数据常修改,或数据量大的从表,第4点取数据时就不要关联表查询了,把主表中取得的从表编号串起来,如当前页20记录,10个产品a,3个产品b,2个产品c,那么产品编只有3个,再从服务器中取之三个产品的信息。这结合第3点写个存储过程或自定义sql函数来读取楼主可加个执行时间来判断,上面每一点对优化速度都提升一些的
      

  13.   

    非常感谢各位的热心解答
    现在加了doevents,表面上看好一些,数据一条一条出来,不知道
    考虑多线程,但是sql内存泄露的问题很难解决,sql会把服务器内存耗尽为止
    现在用设定sql内存的方法,但非根本之计,另开贴讨论
    http://topic.csdn.net/u/20100630/06/bbd6c3af-9356-42f9-8c53-7a0e5ef98e2e.html