锁定老帖子 主题:Internet的数据库信息推送技术实现
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-25
数据库和外部其实根本不需要推送,使用推送还不如使用消息机制。
首先不需要推送是因为数据库的链接都是socket的长连接机制。相对于http的短连接来说,连接的消息是两端都可控的。 其次保持长连接,进行缓冲数据的flush还不如使用消息机制或者RPC来的更合理。服务器的压力始终在于并存的数量,占用资源时间越长,并发的可支持度就越低。既然是服务器与数据库的链接,就不存在无法定向的问题,完全可以定向进行远程调用或远程通信。 |
|
返回顶楼 | |
发表时间:2011-06-25
用pushlet应该可以满足你的要求…
|
|
返回顶楼 | |
发表时间:2011-06-25
不要用触发器 不可靠效率不高 以前做过数字电视实时计费的 就是oracle 处罚器中调用JAVA 后来摘掉了 老老实实写轮询吧
你可以在数据库和服务器中间加层memcached 写个watch dog就行 |
|
返回顶楼 | |
发表时间:2011-06-26
就是Comet技术 Tomcat已经可以实现了 在Servlet3标准中应该已经支持
|
|
返回顶楼 | |
发表时间:2011-06-26
用触发器真的很不保险,数量大和并发大的时候简直就是灾难,如果对一致性要求不是特别高的话,可以尝试下pub/sub的方式,就是前面有同学说过的基于消息的方式
|
|
返回顶楼 | |
发表时间:2011-06-26
基于楼主说的情况,C++服务器负责更新数据,Java服务器负责查询和显示数据,采用触发器来实现这个推送,我觉得楼主的思路是对的。但是有两点需要注意:如果数据量更新不频繁,用触发器应该可以解决,简单而且没什么副作用;如果数据更新的比较快,就像之前一些同学担心的,并发和性能是个问题。如果数据更新快,实时性不是非常高的话,可以考虑采用定时轮询的方式。我对楼主之前一语带过的服务器推送Web界面的东东倒是很感兴趣,最近项目中也要用到相关机制,但是在网上查了下,好像这种成熟的应用组件并不多。
|
|
返回顶楼 | |
发表时间:2011-06-26
可以,触发器+扩展存储过程,以前这么干过,在扩展存储过程里发到MQ。
不过最好是在数据入库之前先通过MQ等方式发出来,这种方式只能是不得已而为之。 |
|
返回顶楼 | |
发表时间:2011-06-27
===============话题1=================== 实时的监控系统 Tibico 已经有好的解决方案了 名字叫Tibico Hawk ,很好很强大, 建议楼主不要重复造轮子了, 如果楼主要重复造轮子的话,可以参考以下它, 一定会有所收获。它里面的push 是用Message queue做的 ===============话题2=================== 另外你说的数据库Push 方式,Oracle的我用过,很稳定。 原理很简单,实现也不麻烦,不过对现有系统要有所改动。 举个简单的例子 如果你要监控A, B,C 三个表,那么你要建立一个监控表M, 和三个表级触发器,另外要在A,B,C 三个表各加一个子段叫Updated_sequence 当A,B,C中有数据被更新时,触发器将向M 表中插入一条数据,内容只要包括表名即可,然后Oracle 有一个数据推送机制,好像叫DB Watch ,可以将M表中的数据推送到 Server端,Sever端根据接收到的表名,和缓存下来的最大 updated_sequence,发送一条select 语句就可以取得被更新的数据 , 例如 select * from A where Updated_sequence> max_updated_sequence, 注意:A,B,C 表中insert , update,时都要修改Updated_sequence 字段,不建议用delete语句,建议用enable/disable字段间接实现delete功能。 |
|
返回顶楼 | |
发表时间:2011-06-27
guoapeng 写道 ===============话题1=================== 实时的监控系统 Tibico 已经有好的解决方案了 名字叫Tibico Hawk ,很好很强大, 建议楼主不要重复造轮子了, 如果楼主要重复造轮子的话,可以参考以下它, 一定会有所收获。它里面的push 是用Message queue做的 ===============话题2=================== 另外你说的数据库Push 方式,Oracle的我用过,很稳定。 原理很简单,实现也不麻烦,不过对现有系统要有所改动。 举个简单的例子 如果你要监控A, B,C 三个表,那么你要建立一个监控表M, 和三个表级触发器,另外要在A,B,C 三个表各加一个子段叫Updated_sequence 当A,B,C中有数据被更新时,触发器将向M 表中插入一条数据,内容只要包括表名即可,然后Oracle 有一个数据推送机制,好像叫DB Watch ,可以将M表中的数据推送到 Server端,Sever端根据接收到的表名,和缓存下来的最大 updated_sequence,发送一条select 语句就可以取得被更新的数据 , 例如 select * from A where Updated_sequence> max_updated_sequence, 注意:A,B,C 表中insert , update,时都要修改Updated_sequence 字段,不建议用delete语句,建议用enable/disable字段间接实现delete功能。 不错 嘿嘿 |
|
返回顶楼 | |
发表时间:2011-06-30
Comet,porlet
|
|
返回顶楼 | |