后台插入数据,前台及时显示问题?

robyjeffding 2009-12-05 02:33:11
我的要求是这样的:
比如:用户A打开首页查看新闻,此时有共有20条新闻(是按时间降序排序的),在用户A浏览新闻的同时,管理员B在后台又插入了一条新闻,此时新闻总数应该是21条。我想在后台插入数据后,前台能够自动监测到后台的变化,然后重新显示最新的数据,而不需要用户A再刷新页面了。
刚开始我想了一下,用ajax做,每隔5—10秒到后台去比较,根据现有数据的总数(从缓存中读取)比较后台的总数(后台查询总数命令查询:select count(*) from news),如果一样就说明数据没有更新,如果不一样,就重新调用方法显示更新的数据。
不知道大家有没有好的思路,特别是对超大数量的记录时(如几百万条数据),大家有没有既优化又简便的方法啊?
...全文
1149 63 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
63 条回复
切换为时间正序
请发表友善的回复…
发表回复
朱超ZhuChao.Tech 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 的回复:]
引用 58 楼 的回复:

不知道“网页即时通讯”对楼主有什么启发。

推技术不了解,但是呢能不能这样:后台发送一个消息到消息队列中,并提醒前台接受这个消息,前台接到提示就从消息队列中取出最新消息显示出来。
ps消息队列也是java规范吧,似乎能归到j2ee中。

具体怎么实现我也不知道,看楼主功力了

你说的是jms和前台无关,不过可以围绕jms做一个方案。但前台的问题是还是需……
[/Quote]

一看就知道不懂JMS 。
NewMoons 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 的回复:]

不知道“网页即时通讯”对楼主有什么启发。

推技术不了解,但是呢能不能这样:后台发送一个消息到消息队列中,并提醒前台接受这个消息,前台接到提示就从消息队列中取出最新消息显示出来。
ps消息队列也是java规范吧,似乎能归到j2ee中。

具体怎么实现我也不知道,看楼主功力了
[/Quote]
你说的是jms和前台无关,不过可以围绕jms做一个方案。但前台的问题是还是需要“拉”技术。
NewMoons 2012-08-30
  • 打赏
  • 举报
回复
请参考一下 推技术,不过现在浏览器还没有标准支持。
下面的文章对你也许有点帮助。
http://hi.baidu.com/zkheartboy/item/f54424d53cd83cce1a72b453
kky2010_110 2012-08-30
  • 打赏
  • 举报
回复
不知道“网页即时通讯”对楼主有什么启发。

推技术不了解,但是呢能不能这样:后台发送一个消息到消息队列中,并提醒前台接受这个消息,前台接到提示就从消息队列中取出最新消息显示出来。
ps消息队列也是java规范吧,似乎能归到j2ee中。

具体怎么实现我也不知道,看楼主功力了
pxxaish9527 2012-08-30
  • 打赏
  • 举报
回复
采用DWR框架和反向AJAX技术就可以实现楼主想要的效果---“推”服务,没有必要在数据库层做什么操作,可以尝试一下,我现在的项目中就是这么做的,效果不错,希望能给楼主有所帮助!!!
tlmy 2012-08-30
  • 打赏
  • 举报
回复
刚开始我想了一下,用ajax做,每隔5—10秒到后台去比较,根据现有数据的总数(从缓存中读取)比较后台的总数(后台查询总数命令查询:select count(*) from news),如果一样就说明数据没有更新,如果不一样,就重新调用方法显示更新的数据。
有问题!如果管理员在添加进去一条数据 然后再删除一条以前的数据的时候,你的数量是不会变化的!这种情况下你该怎么办呢!!!!
如果你只想通过去后台照的话 那么建议你在写一个get类,用来监控数据库,数据库里面用个字段seq 每次+1 ,每次导入数据的时候 seq+1 ,get类获取seq更新信息,然后告知你的前台,你的前台去更新数据!
zgycsmb 2012-08-28
  • 打赏
  • 举报
回复
用jquery+ajax
水瓶小鱼 2012-08-28
  • 打赏
  • 举报
回复
学习了!九楼的方法的确可行!
asdf544265772 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
在你的放一些配置信息的表(一般都有一个这样的表,如果没有就建一个,就一条记录)里增加这样一个标志 isNewsUpdate,1表示有更改,0表示无更改。
然后后台建个触发器,有更新(insert/update/delete)的时候,把0变成1。
你的ajax就先查这个配置项。如果是1,就变回0,把新闻当前所在的分页重刷。如果是0,那就不动。
先查一个小表总比查几百万条记录要快。而且你的cou……
[/Quote]

学习
ncist_jianeng 2012-08-28
  • 打赏
  • 举报
回复
使用dwr的反向ajax技术应该行。
http://blog.csdn.net/fhd001/article/details/7089024
Crusol 2012-08-28
  • 打赏
  • 举报
回复
纯属学习和交流。
可否用java Observer观察者模式,如果观察到有UPDATE变化,就把得到的最新的结果用DWR推到对应的页面更新。我查了一下DWR的推模式,和平时的DWR应用基本是一样。(http://wenku.baidu.com/view/eb008b6048d7c1c708a1456f.html),可以参考一下
cxw3152 2012-08-28
  • 打赏
  • 举报
回复
卡卡你好: 我以前做过类似的功能 不过数据库使用的是oracle数据库。。给你那张表写一个触发器 触发器调用一个存储过程 该存储过程的作用是查找出当前在线的用户的所有IP 然后调用数据库中的JAVA程序给每个用户客户端发送UDP信息。。这个时候页面必须有一个相应的插件来检查你相应的端口调用相应的方法来重新加载数据。
dgcxyc 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 1 楼 sinpinle 的回复:
前台的max(id),直接从后台查询 >max(id)//前台的最大id

本来有20条,max(id)也是20,如果我在中间删除一条id为10的记录,max(id)仍然还是20,
这样就达不到及时更新的效果了!
[/Quote]


如果你的这个id是自增的话,你删除,max(id)就不会还是20了。
不过不管怎么样,你用minus可以?
雍寇德 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

在你的放一些配置信息的表(一般都有一个这样的表,如果没有就建一个,就一条记录)里增加这样一个标志 isNewsUpdate,1表示有更改,0表示无更改。
然后后台建个触发器,有更新(insert/update/delete)的时候,把0变成1。
你的ajax就先查这个配置项。如果是1,就变回0,把新闻当前所在的分页重刷。如果是0,那就不动。
先查一个小表总比查几百万条记录要快。而且你的co……
[/Quote]

这个还是比较好的
yjflinchong 2012-08-28
  • 打赏
  • 举报
回复
用数据推送。 相当于ajax反过来操作。

comet推送 技术试试吧。
大叔obnijeh 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 的回复:]
使用dwr的反向ajax技术应该行。
http://blog.csdn.net/fhd001/article/details/7089024
[/Quote]
大哥,别人2009年问的问题,那时候推技术还没有。今时不同往日了。
yanyanjiang618 2012-08-28
  • 打赏
  • 举报
回复
#9楼的方法很好
zzlovelyboy 2012-08-06
  • 打赏
  • 举报
回复
这样定时刷新的对于性能上的消耗太多了吧。。。。
robyjeffding 2009-12-28
  • 打赏
  • 举报
回复
这个问题就这样pass了?期待高手!
robyjeffding 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 wenjjing2lianee 的回复:]
引用 9 楼 crazylaa 的回复:
在你的放一些配置信息的表(一般都有一个这样的表,如果没有就建一个,就一条记录)里增加这样一个标志 isNewsUpdate,1表示有更改,0表示无更改。
然后后台建个触发器,有更新(insert/update/delete)的时候,把0变成1。
你的ajax就先查这个配置项。如果是1,就变回0,把新闻当前所在的分页重刷。如果是0,那就不动。
先查一个小表总比查几百万条记录要快。而且你的count(*)也不准,如果管理员在这5秒~10秒内刚好删了一条又加了一条,或者修改了某个,那你前台根本就检测不到啊

当然你可能会说几百万条的情况下,触发器会影响你的i/u/d,使之变慢。但是,i/u/d是管理端的事情,要浏览的用户体验好一点,适当牺牲后台管理的时间也是可以的。。。

另外,trigger驱动java程序去通知jsp前台做改变,没有实现过,不知道数据库有没有这种机制。。。只知道oracle可以调用java程序。但得先把java程序导进oracle,能不能跟外面的程序通讯,就不知道了。

个人意见,仅供参考。


这个挺实用的

[/Quote]
是啊,目前为止最好的回答
加载更多回复(42)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧