各位:    在我们的项目中,有一个模块不定时向数据库中插入数据,在另外一个模块中客户要求尽可能实时的响应数据插入,提醒用户做出处理。    我们目前的作法是这样:在首页中利用javascript定期刷新某个页面,在这个页面中访问数据库,看是否有新的数据,如果有新的数据,就弹出一个页面供用户处理。    在多个用户同时访问的的情况下,如果设置刷新页面的间隔较短,由于每个首页都定期刷新页面,造成频繁访问数据库,导致程序运行非常慢;如果设置刷新页面的时间较长,实时响应又难以做到。    不知道要保证系统的实时响应,又不至于导致运行速度缓慢,有没有好的办法和方案?    谢谢!

解决方案 »

  1.   

    每个客户端每隔几秒刷新一次去DB获取新数据,基本是不可取。
    原因:如果有100个,200个客户端一起开着IE浏览, 那DB不是完了....解决方法(只是提议,没仔细考虑可行不可行):
    IIS那端运行一个线程,此线程每几秒去DB获取一次数据。 
    所有客户端刷新去取新数据全部取这个线程已经取到的数据集。这样不管有多少个客户端开着,每几秒只会有一次访问DB。
      

  2.   

    sorry,看错了, 以为是在.net版里....
    不过原理一样, AP SERVER那里运行一个线程,
    此线程每几秒去DB获取一次数据。把数据保存在Application级别的Cache中或则某个class的static变量里。 (不要保存ResoultSet, 因为Connection关了就没了。)
      

  3.   

    1: 数据放在内存共享,类似DataSet
    2:用户登陆后记录状态并分配cache
    3:把更新部分记录索引放在各用户cache中
    4:可以用ajax或其他技术根据cache内容,从内存取的更新记录,更新页面
    5:监听session, 撤消过期或者登出用户,并清除其cache
      

  4.   

    刚刚经历了一个这样的项目,是用楼主的那个方法解决的,好在我们提醒的是最顶端的用户,只有那么几个。
    后来想了想,基本思路和sozdream() 所说的一样。
    就是用在服务器端运行一个线程,延时查询数据库,然后更改application的某个属性,或者修改一个配置文件,然后客户端延时查询application或是配置文件就OK了。
    应该比楼主现在的方法节省资源。
      

  5.   

    谢谢楼上的各位!我们现在的解决思路跟上面各位提到的有类似之处。由于向数据库中插入数据的来源是另外一家公司,通过双方的接口,他们通知我们有新数据,我们获得新数据然后插入自己的数据库,所以我可以在接口中实时获知何时有新数据。设置一个类的静态变量作为有新数据的标识位,在接口中接到通知获取数据的时候,把标识位设置为1。页面定时读取这个标识位,如果为1,就到数据库中读取数据,并把数据放入application变量,把标识位设置为0;页面读取标识位如果为0,就到application中读取数据。
      

  6.   

    jihanzhong(逍遥)老兄,能否就你的思路展开说一下,或者提供相关资料?呵呵,谢谢了!