用定时器向远程数据库查询数据?

时间:2022-12-14 00:50:54
使用两层C/S设计,通过互联网登录远程数据库,客户端同时在线大约有200个。
客户端需要定时查询远程数据库的一些信息,如通知、短信、批阅等文本,于是在客户端放置了3-5个定时器,通过Select语句(都比较简单,查询结果是一些简单的文本)每1-5称向服务器查询相关内容。
 由于不懂Socket编程,于是通过这种笨的方法实现网络通信。 这样的设计有什么问题吗,会不会导致客户端和服务器端网络过于繁忙?

13 个解决方案

#1


控制好刷新间隔应该还行。

实时更新只有推和拉这两种方法,楼主用的是拉的方法,因此肯定会造成一定效率的损耗,因为客户端不知道什么时候该获取更新的数据,不过拉模型实现起来很简单。效率实在不行的话就考虑推,也就是当服务器发现有需要更新的数据时再通知客户端来获取,这样客户端就不用老是去刷新数据了。

#2


稍微说错了点,推的话,应该是服务器直接把要更新的数据发给客户端解释。

#3


最好是服务端能向客户端发送更新指令,客户端接收后才进行数据刷新,不要定时的去刷新,造成资源浪费

#4


谢谢,但是我用的是二层模式,服务器端只有数据库,不知道如何将数据“推出”,用存贮过程吗?
再说,即使把数据推到了客户端,客户端程序仍然没有办法感知呀,还得靠定时器定时监听。

#5


二层就没办法了,只好刷。如果刷的时候实在会造成数据库压力大的话(例如刷一次SELECT的数据很多),可以考虑做一张标识表,标识哪张表的数据发生了变化,发生变化的时间(由程序维护),然后客户端去刷这张表,刷到客户端最后更新时间小于这张表的最新更新时间时,再去SELECT实际数据。

推给客户端的话,如果是SOCKET那种就可以在接收到的指令时候对接收的内容(例如服务器返回一个XML),然后客户端具体模块再解释这个XML来更新界面数据。又或者象3楼说的接收到通知,然后再去刷。

或者建议楼主可以先试试直接刷有没有问题吧,如果有问题再考虑进一步解决方法。

#6


“标识哪张表的数据发生了变化,发生变化的时间(由程序维护)” -> 也可以考虑触发器

#7


在表中增加一更新标志字段,每次从服务器只查询/下载最近更新的(老的数据取自客户端就可以了),以减少数据传输量和网络负担

#8


是的,我在数据库建了标识,尽可能减轻网络负担。
问题是每个客户端都有5个左右定时器,而且大约有200个客户端每1-3秒不停地刷,程序运行多久就刷多久,服务器受不受得了?而定时获得服务数据仅是我程序中一个很次要但又必要的功能,牺牲这么多网络资源是否合适呢?

#9


引用 8 楼 sxqwhxq 的回复:
是的,我在数据库建了标识,尽可能减轻网络负担。 
问题是每个客户端都有5个左右定时器,而且大约有200个客户端每1-3秒不停地刷,程序运行多久就刷多久,服务器受不受得了?而定时获得服务数据仅是我程序中一个很次要但又必要的功能,牺牲这么多网络资源是否合适呢?

服务器的压力肯定是很大的,你可以监测一下服务器的CPU,内存等使用情况,你的SQL是如何写的(数据库是什么),看看能不能优化,既然你只能这样刷新,就把其它的尽量调成最优状态。

#10


看来,不借助WinSocket是没有办法实现推的,即由服务器向客户端发送信息。
即使使用存贮过程也没用,因为服务器根本不知道客户端在那。
但仔细想了想,通过互联网连接数据库服务器后能够实现数据的增、删、改等操作,则数据库系统一定是通过tcp/ip协议及WinSocket联系服务器和客户机的,只不过一般的数据库系统在语言级别上没有把服务器与客户机之间的通讯函数公开提供给用户罢了(至少我使用的Sybase Sql AnyWhere 9是没有提供类似的函数的)。

#11


如果要这样搞的话我觉得就太复杂化了 -_- 

#12


用三层的话比较好

#13


 OleContainer1.OleObject.Application.ActiveDocument.PrintPreview ;

#1


控制好刷新间隔应该还行。

实时更新只有推和拉这两种方法,楼主用的是拉的方法,因此肯定会造成一定效率的损耗,因为客户端不知道什么时候该获取更新的数据,不过拉模型实现起来很简单。效率实在不行的话就考虑推,也就是当服务器发现有需要更新的数据时再通知客户端来获取,这样客户端就不用老是去刷新数据了。

#2


稍微说错了点,推的话,应该是服务器直接把要更新的数据发给客户端解释。

#3


最好是服务端能向客户端发送更新指令,客户端接收后才进行数据刷新,不要定时的去刷新,造成资源浪费

#4


谢谢,但是我用的是二层模式,服务器端只有数据库,不知道如何将数据“推出”,用存贮过程吗?
再说,即使把数据推到了客户端,客户端程序仍然没有办法感知呀,还得靠定时器定时监听。

#5


二层就没办法了,只好刷。如果刷的时候实在会造成数据库压力大的话(例如刷一次SELECT的数据很多),可以考虑做一张标识表,标识哪张表的数据发生了变化,发生变化的时间(由程序维护),然后客户端去刷这张表,刷到客户端最后更新时间小于这张表的最新更新时间时,再去SELECT实际数据。

推给客户端的话,如果是SOCKET那种就可以在接收到的指令时候对接收的内容(例如服务器返回一个XML),然后客户端具体模块再解释这个XML来更新界面数据。又或者象3楼说的接收到通知,然后再去刷。

或者建议楼主可以先试试直接刷有没有问题吧,如果有问题再考虑进一步解决方法。

#6


“标识哪张表的数据发生了变化,发生变化的时间(由程序维护)” -> 也可以考虑触发器

#7


在表中增加一更新标志字段,每次从服务器只查询/下载最近更新的(老的数据取自客户端就可以了),以减少数据传输量和网络负担

#8


是的,我在数据库建了标识,尽可能减轻网络负担。
问题是每个客户端都有5个左右定时器,而且大约有200个客户端每1-3秒不停地刷,程序运行多久就刷多久,服务器受不受得了?而定时获得服务数据仅是我程序中一个很次要但又必要的功能,牺牲这么多网络资源是否合适呢?

#9


引用 8 楼 sxqwhxq 的回复:
是的,我在数据库建了标识,尽可能减轻网络负担。 
问题是每个客户端都有5个左右定时器,而且大约有200个客户端每1-3秒不停地刷,程序运行多久就刷多久,服务器受不受得了?而定时获得服务数据仅是我程序中一个很次要但又必要的功能,牺牲这么多网络资源是否合适呢?

服务器的压力肯定是很大的,你可以监测一下服务器的CPU,内存等使用情况,你的SQL是如何写的(数据库是什么),看看能不能优化,既然你只能这样刷新,就把其它的尽量调成最优状态。

#10


看来,不借助WinSocket是没有办法实现推的,即由服务器向客户端发送信息。
即使使用存贮过程也没用,因为服务器根本不知道客户端在那。
但仔细想了想,通过互联网连接数据库服务器后能够实现数据的增、删、改等操作,则数据库系统一定是通过tcp/ip协议及WinSocket联系服务器和客户机的,只不过一般的数据库系统在语言级别上没有把服务器与客户机之间的通讯函数公开提供给用户罢了(至少我使用的Sybase Sql AnyWhere 9是没有提供类似的函数的)。

#11


如果要这样搞的话我觉得就太复杂化了 -_- 

#12


用三层的话比较好

#13


 OleContainer1.OleObject.Application.ActiveDocument.PrintPreview ;