棘手的数据库问题.

pop133 2001-09-18 01:29:04
我现在正开发C/S模式的数据库服务程序,多客户共享服务器中的SQL SERVER数据库.数据库中的任何改变都要在客户机上(未知台数)实时的显示出来.我现在的算法是在客户端程序添加Timer控件,此控件每隔一秒读取数据库中的数据来判定数据库是否改变,如果改变则读取.(相当于后台监控)但是现在的问题是用Timer太占系统资源,平均每隔一定的时间都要自动重读数据库来判定数据库是否改变,操作其他的功能时有明显的停顿,特别是在网络硬件设施不太好的情况下,读取每单位的数据量传输效率都不是很高,更别说是每隔一定的时间读一次了!(这个时间不能超过1秒)速度简直是蜗牛不说,Timer中的程序占用了单线程,执行其他本程序的功能时简直就不能用了.我也曾经试图将Timer中的处理用多线程来实现,但是vb好像做多线程的程序不太现实,不是非法操作就是内存不能读.(差点儿用vb.net写) 请问大家服务器的数据库改变实时
的通知客户机有没有什么更好的算法?去掉这个讨厌的Timer控件? winsock也不能用.
如果不能去掉有没有什么办法最基本的让程序在任何的网络环境下运行的流畅?
help me !Think you!
...全文
131 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ozw 2001-09-19
如果只是为了减少数据的传输量
建议你在数据库中做一个只有一个字段,一条记录的表,这条记录的内容是最新更新的时间(用触发器更新该记录)
你的Timer读纪录的时候,先读这个纪录,并记录下来,每次读的时间更上次读的时间比较,如果时间更新了,就说明需要显示的数据更新了,再去读要显示的数据,那就可以降低系统资源了
回复
cwerror 2001-09-19
在sql_server中判断连接机制,若有连接则在连接数上加1.
回复
ozw 2001-09-19
数据库同步,其实是两个数据库服务器间的数据库同时更新问题,跟你这个问题几乎没有关系
你的适时显示是个什么样的概念?同时显示多少条记录?
回复
bdzwc 2001-09-19
up
回复
pop133 2001-09-19
还有!数据库同步是个什么概念?哪里还有这方面的比较多多的文章?
让我拜读拜读.
回复
pop133 2001-09-19
数据库需要x台客户机的访问(1<x<最大数),现在的问题就是在服务器端不能驻留任何形式的后台程序,我想能不能在客户端程序不扫描服务器数据库,用sql server的存储过程或者是触发器自动返回改变的值?
hydnoahark(诺亚方舟)的方法好像不错,让我测试测试!
请大家说说还有什么好的方法?最好是不用winsock发送纪录的!
因为我觉得在客户端多的时候用winsock一次一次的发不一定就比Timer快.
回复
pop133 2001-09-19
to ozw(沧浪客)
我现在用的就是这个算法!就是这个算法速度还是慢!主要是网络流量不够快!
毕竟主要原因还是一秒钟执行一次存储过程受不了呀!
回复
lanren_me 2001-09-18
up
回复
hydnoahark 2001-09-18
你可以考虑在数据库中使用触发器,当数据发生变化的时候,在触发器中使用sp_OACreate等访问服务器上的OLE 对象(传递发生变化的纪录的ID),服务器上的OLE 对象使用Winsock发送发生变化的纪录的ID到所有的客户端程序,客户端程序搜索数据库显示所有的变化的纪录。

回复
allen_xxx 2001-09-18
我觉得icevi(按钮工厂)的做法不错。
我刚写了一个类似的程序,我用的全是winsock,客户端登录时通过winsock与服务端建立连接,并通过发送简单命令字串给服务端来完成各项数据库操作。
不知道你的这个数据库是否有其他程序可以修改,如果是那样,那么直接用timer是最快的;
如果所有的数据库更新都要通过你的服务端在操作,那么可以在执行完数据库操作后,由服务端向
各登录客户端发送数据更新消息。
回复
starbattler 2001-09-18
如果真需要如此及时的更新,恐怕就算实现了,也要付出巨大的代价。不仅是服务器,而且客户端也是。试试服务端,客户端数据库同步。看看是否适合你的程序。我在http://www.wzjcw.net/vbgood/ 看到过有关数据库同步的文章!
回复
starbattler 2001-09-18
如果真需要这么及时,不如看看数据库同步的方法,试试对你合不合适
回复
pp616 2001-09-18
嘻嘻。
回复
icevi 2001-09-18
其实我觉得不必要一定用客户端侦听的方法。
你可以用服务器来传消息。

你在服务器上做一个程序,专门用来监视数据库并收发消息。 客户端程序启动时,发送本地IP地址到服务器上注册,关闭时再到服务器上去注销 。 服务器上用TIMER 或其他方法检测到数据库的变化时, 就发消息到各工作站,各工作站收到消息后转去相应的处理过程。

工作站中需要能保存服务器的IP地址,做为配置文件保存下来,每次程序启动时自动注册。

用WINSOCK 可以,当然有其他更好的通信控件也可以。

用上面的方法,工作站不需要有timer , 只在服务器上有一个,相信速度会快很多。
回复
LiaoCheng 2001-09-18
你可以在客户机启动的时候发一个消息到服务器,这样服务器就可以得到客户机的IP
服务器的IP只好你自己指定了
回复
pop133 2001-09-18
不过除了winsock之外有什么更好的方法?
现在同类的程序在这方面都是怎么实现的?
回复
pop133 2001-09-18
如果真的要用winsock,该从哪入手?
不过我现在觉得winsock方法不是最好的.
也可能是我对winsock不是很熟!
在服务器上得到客户机的ip地址,怎么样才能自动得到客户机的ip地址?
客户机如何自动得到服务器的ip地址开始侦听?
回复
Jneu 2001-09-18
gz
回复
songyangk 2001-09-18
用winsock为什么不行呢?这个方法几乎是最好的了.
回复
相关推荐
发帖

1188

社区成员

VB 数据库(包含打印,安装,报表)
申请成为版主
帖子事件
创建了帖子
2001-09-18 01:29
社区公告
暂无公告