请教各位高手,三层数据库中,如何解决一个客户端修改数据后,其他客户端显示的数据自动同步更新?

时间:2022-05-27 09:00:50
 使用ADO+DataSetProvider+ClientDataSet连接

共五个客户端,每个客户端都有一个DBGrid来显示数据,当其中一个客户端新增或修改了数据提交后,其他的客户端都得不到该数据的修正。除非手动CLOSE、OPEN 等动作。

小弟初学多层的数据库以及多客户端,比较迷茫,不知要如何才能自动更新到其他客户端的DBGRID,实现同步??

37 个解决方案

#1


使用什么方式连接

#2


使用DataSnap2010来连接
服务端使用DSTCPServerTransport
客户端使用DSProviderConnection

#3


数据量不是很大的话,可以考虑显示的部分用timer事件刷新一下。

#4


用TIMER刷新是可以实现,但如果设置的时间长,就起不到实时的效果,时间短了,又不太现实。

#5


刷新數據就可以了。。。

#6


不要刷,我这边的客户抱怨过这个问题。
你放一个 “刷新”按钮,让他们自己点。
但是,修改某条数据的时候,一定要取它在数据库的内容。而不是残留在界面上的东西。

#7


 这个要操作员自己去 刷新 吧,现在的客户都真的把自己当作上帝了,他们怎么不嫌 拉屎还要脱裤子费事呢。

#8


给“刷新”按钮这个方法,不符合客户端的工作需求。客户端最重要的一项工作就是操作人根据数据的变化,进行操作,是被动的,不是主动的。如果要求操作人不断按“刷新”,我估计,一定会按疯。实时数据是客户端最终的目的。

#9


不能设置‘刷新’按钮。一定要做到实时更新。股票系统的数据怎么处理的呢?“大智慧”不都是实时的吗?

#10


查了一些资料,有些认为服务器端通过UDP通讯广播通知其余客户端刷新数据,让客户端接收指令后进行“刷新”。
难道只有通过客户端主动去刷数据的方法吗??没有方法让服务端主动向客户端推数据吗?

#11


继续关注

#12


关注一下

#13


关注一下,以后用得着

#14


将datasetprovider 的options下的popropogatechanges=true;poautorefresh=true即可实服务器的所有变化自动返回到clientdataset中,这个方法有人说可以,也有说不可以。到底可以吗???
最近有外,这段时间都无法测试验证一下,有试过的朋友,请留言,谢谢!!

#15


关注。。

#16


引用 14 楼 zwf8888 的回复:
将datasetprovider 的options下的popropogatechanges=true;poautorefresh=true即可实服务器的所有变化自动返回到clientdataset中,这个方法有人说可以,也有说不可以。到底可以吗???
最近有外,这段时间都无法测试验证一下,有试过的朋友,请留言,谢谢!!


就算这个方法是可以的,也就是一个 Timer。
除非服务器端维护 5 份数据。(跟Client界面上显示的一模一样)。
然后,哪个数据要变化,就按某个规则推送 Client 变更这个值。
没有镜像文件,哪里来的“实时”?!

byw,UDP的话,你也需要考虑是否丢包。更复杂。

#17


如果服务端向客户端送数据,那么,服务端就要是有状态的(需要保持每个客户端当前数据的状态以决定如何向客户端送数据),这种方式,如果客户端很少,那没问题,如果多了,服务端会承受不了。

现在的应用模式,都是向服务端无状态的方式演化,因此才是状态信息在客户端,客户端需要数据的时候主动向服务器请求的方式。

你所说的要求,可以采用在服务端单独做个服务程序,用来通知客户端数据的变动(像你说的udp广播也是一种方式),然后由客户端向服务端请求数据。
当然了,你完全可以将数据的变动信息放在udp广播中,这样客户端接到广播通知后直接刷新本地数据就是了。

#18


只有引导用户,养成“刷新”的习惯了。

#19


另外使用下面方法:
    在服务器端定时扫描,检查数据是否更新,发信息通知客户端。
    1、客户端手动“刷新”;
    2、客户端自动“刷新”;

#20


如果用普通的MIDAS三层的话,一个客户通知服务去刷新其它客户的操作,相对于这样的接口不是很好实现,
首先:你可以借用TUDP或TTCPSOCKET来进行。本来用TSOCEKETCONNECTION做客户端连接话,同样可以回调用一个接口来引发,不过效率可能不是很好。

其次用第三方实现的三层,如REMOBJECT。本身就有TEVENT控件,可以很好的实现C-S,S-C之间的通迅。

对于TDCOMCONNNCTION这种模式的话,未试过。

#21


更新消息,我觉得应该可行, 即当某一客户更新数据,提交到服务器端,服务器端执行更新后,发消息到各客户端,数据已更新,更客户端执行重导.

好像记得有些属性设置后,会根据修改时间决定最后的结果

#22


比如

ltOptimistic 独立模式(与原来结果集对照,如果在此期间其它用户修改了结果,则你的结果不能保存)

#23


发个UDP广播

#24


一个人修改时,不允许其他人修改

#25


修改某条数据的时候,一定要取它在数据库的内容。而不是残留在界面上的东西。

加"立即刷新"

timer定时刷新(时间可稍长一些, 如20分钟)

这几条加到一起, 就可以了. 兼顾用户体验与编程复杂性. 

#26


该回复于2010-12-07 13:25:37被版主删除

#27


UDP
通知服务端有更改
服务端广播之

#28


UDP
通知服务端有更改
服务端广播之

#29


该回复于2010-11-15 09:05:28被版主删除

#30


大智慧 也不是要设置刷新时间的吗?

#31


你这个设计就叫推数据,服务器向客户端发数据就叫‘推’,客户端从服务器上取数据就叫‘拉’,你最好在服务器上做一客户端状态登记。如果数据反生了变化,就根据那个状态信息,向客户端推数据就可以解决。很简单的。只是你要不断的检查这个客户端的状态。

#32


数据库相关表是不是需要设置触发器?

#33


做一个短信发布器。一但数据更新,就广播出去,通知客户更新数据。 

#34


学习学习!!

#35


路过,学习中

#36


综合各方面考虑,最终还用通过IDTCPSever/IdTcpClinet通信,客户端收到特写信息进行刷新,感激大家提供宝贵的意见与经验,谢谢!!!

#37


补充下:除了IDTCPSever/IdTcpClinet通知客户端刷新外,还同时用IDTCPSever/IdTcpClinet通信将一些简单的数据通过记录方式发送到客户端。

#1


使用什么方式连接

#2


使用DataSnap2010来连接
服务端使用DSTCPServerTransport
客户端使用DSProviderConnection

#3


数据量不是很大的话,可以考虑显示的部分用timer事件刷新一下。

#4


用TIMER刷新是可以实现,但如果设置的时间长,就起不到实时的效果,时间短了,又不太现实。

#5


刷新數據就可以了。。。

#6


不要刷,我这边的客户抱怨过这个问题。
你放一个 “刷新”按钮,让他们自己点。
但是,修改某条数据的时候,一定要取它在数据库的内容。而不是残留在界面上的东西。

#7


 这个要操作员自己去 刷新 吧,现在的客户都真的把自己当作上帝了,他们怎么不嫌 拉屎还要脱裤子费事呢。

#8


给“刷新”按钮这个方法,不符合客户端的工作需求。客户端最重要的一项工作就是操作人根据数据的变化,进行操作,是被动的,不是主动的。如果要求操作人不断按“刷新”,我估计,一定会按疯。实时数据是客户端最终的目的。

#9


不能设置‘刷新’按钮。一定要做到实时更新。股票系统的数据怎么处理的呢?“大智慧”不都是实时的吗?

#10


查了一些资料,有些认为服务器端通过UDP通讯广播通知其余客户端刷新数据,让客户端接收指令后进行“刷新”。
难道只有通过客户端主动去刷数据的方法吗??没有方法让服务端主动向客户端推数据吗?

#11


继续关注

#12


关注一下

#13


关注一下,以后用得着

#14


将datasetprovider 的options下的popropogatechanges=true;poautorefresh=true即可实服务器的所有变化自动返回到clientdataset中,这个方法有人说可以,也有说不可以。到底可以吗???
最近有外,这段时间都无法测试验证一下,有试过的朋友,请留言,谢谢!!

#15


关注。。

#16


引用 14 楼 zwf8888 的回复:
将datasetprovider 的options下的popropogatechanges=true;poautorefresh=true即可实服务器的所有变化自动返回到clientdataset中,这个方法有人说可以,也有说不可以。到底可以吗???
最近有外,这段时间都无法测试验证一下,有试过的朋友,请留言,谢谢!!


就算这个方法是可以的,也就是一个 Timer。
除非服务器端维护 5 份数据。(跟Client界面上显示的一模一样)。
然后,哪个数据要变化,就按某个规则推送 Client 变更这个值。
没有镜像文件,哪里来的“实时”?!

byw,UDP的话,你也需要考虑是否丢包。更复杂。

#17


如果服务端向客户端送数据,那么,服务端就要是有状态的(需要保持每个客户端当前数据的状态以决定如何向客户端送数据),这种方式,如果客户端很少,那没问题,如果多了,服务端会承受不了。

现在的应用模式,都是向服务端无状态的方式演化,因此才是状态信息在客户端,客户端需要数据的时候主动向服务器请求的方式。

你所说的要求,可以采用在服务端单独做个服务程序,用来通知客户端数据的变动(像你说的udp广播也是一种方式),然后由客户端向服务端请求数据。
当然了,你完全可以将数据的变动信息放在udp广播中,这样客户端接到广播通知后直接刷新本地数据就是了。

#18


只有引导用户,养成“刷新”的习惯了。

#19


另外使用下面方法:
    在服务器端定时扫描,检查数据是否更新,发信息通知客户端。
    1、客户端手动“刷新”;
    2、客户端自动“刷新”;

#20


如果用普通的MIDAS三层的话,一个客户通知服务去刷新其它客户的操作,相对于这样的接口不是很好实现,
首先:你可以借用TUDP或TTCPSOCKET来进行。本来用TSOCEKETCONNECTION做客户端连接话,同样可以回调用一个接口来引发,不过效率可能不是很好。

其次用第三方实现的三层,如REMOBJECT。本身就有TEVENT控件,可以很好的实现C-S,S-C之间的通迅。

对于TDCOMCONNNCTION这种模式的话,未试过。

#21


更新消息,我觉得应该可行, 即当某一客户更新数据,提交到服务器端,服务器端执行更新后,发消息到各客户端,数据已更新,更客户端执行重导.

好像记得有些属性设置后,会根据修改时间决定最后的结果

#22


比如

ltOptimistic 独立模式(与原来结果集对照,如果在此期间其它用户修改了结果,则你的结果不能保存)

#23


发个UDP广播

#24


一个人修改时,不允许其他人修改

#25


修改某条数据的时候,一定要取它在数据库的内容。而不是残留在界面上的东西。

加"立即刷新"

timer定时刷新(时间可稍长一些, 如20分钟)

这几条加到一起, 就可以了. 兼顾用户体验与编程复杂性. 

#26


该回复于2010-12-07 13:25:37被版主删除

#27


UDP
通知服务端有更改
服务端广播之

#28


UDP
通知服务端有更改
服务端广播之

#29


该回复于2010-11-15 09:05:28被版主删除

#30


大智慧 也不是要设置刷新时间的吗?

#31


你这个设计就叫推数据,服务器向客户端发数据就叫‘推’,客户端从服务器上取数据就叫‘拉’,你最好在服务器上做一客户端状态登记。如果数据反生了变化,就根据那个状态信息,向客户端推数据就可以解决。很简单的。只是你要不断的检查这个客户端的状态。

#32


数据库相关表是不是需要设置触发器?

#33


做一个短信发布器。一但数据更新,就广播出去,通知客户更新数据。 

#34


学习学习!!

#35


路过,学习中

#36


综合各方面考虑,最终还用通过IDTCPSever/IdTcpClinet通信,客户端收到特写信息进行刷新,感激大家提供宝贵的意见与经验,谢谢!!!

#37


补充下:除了IDTCPSever/IdTcpClinet通知客户端刷新外,还同时用IDTCPSever/IdTcpClinet通信将一些简单的数据通过记录方式发送到客户端。