JAVA做一个涉及倒计时功能的问题
我做个网上拍卖的系统,需要个倒计时的功能,比如倒计时300秒(如数据库里商品的time=300),有人出价就开始倒计时,有人加价就重置到300秒再倒。我现在的做法是一个拍...
我做个网上拍卖的系统,需要个倒计时的功能,比如倒计时300秒(如数据库里商品的 time=300),有人出价就开始倒计时,有人加价就重置到300秒再倒。我现在的做法是一个拍品有人竞价,就单独开始一个线程,在线程里隔一秒减一下数据库里设置的time。
但这样做,在拍品少的时候没问题,当有几百上千件拍品,且全部有人出价时,就搞不定了。不说线程的数量,就每秒更新数据库的时间都超过了1秒,再加上线程里设置的1秒延时,页面上会2秒才动一下了。
想请教下大家,有没有别的方法,性能更好的?
大家都提到放到内存里更新,这样肯定是最好的。但我这有一些要求的,放内存的话一断服务器出问题,我这剩下的秒数就没有了,而我是需要这数据以最快的时间接着开的。
谢谢大家的帮助,这让我咋选最佳答案啊。。。。。 展开
但这样做,在拍品少的时候没问题,当有几百上千件拍品,且全部有人出价时,就搞不定了。不说线程的数量,就每秒更新数据库的时间都超过了1秒,再加上线程里设置的1秒延时,页面上会2秒才动一下了。
想请教下大家,有没有别的方法,性能更好的?
大家都提到放到内存里更新,这样肯定是最好的。但我这有一些要求的,放内存的话一断服务器出问题,我这剩下的秒数就没有了,而我是需要这数据以最快的时间接着开的。
谢谢大家的帮助,这让我咋选最佳答案啊。。。。。 展开
4个回答
展开全部
在线程里隔一秒减一下数据库里设置的time。这么犀利的招数你都能想的出来啊!你的服务器还真是强大,不死机都谢天谢地啊!
具体的代码我懒的写,给你个思路吧,写线程但是别往数据库存,线程有睡眠功能.sleep(),有人点了竞拍,线程启动,立马睡眠300秒,睡醒就表示竞拍时间结束了,可以往数据库存了,要是又有人竞拍这个物品,前面睡眠的线程直接stop,再开一个线程继续睡觉300秒
具体的代码我懒的写,给你个思路吧,写线程但是别往数据库存,线程有睡眠功能.sleep(),有人点了竞拍,线程启动,立马睡眠300秒,睡醒就表示竞拍时间结束了,可以往数据库存了,要是又有人竞拍这个物品,前面睡眠的线程直接stop,再开一个线程继续睡觉300秒
更多追问追答
追问
这样做的话,前端页面上的倒计时秒数要如何显示呢?
追答
这个是每个登陆的人都要看到吗?还是只是当前竞拍的人能看到,要是只是当前竞拍的人看,可以直接在页面上做一个倒计时,不需要关联程序
如果是每个人都要看到,你可以把在线程启动的时候把时间记下来,放在缓存中最好要是怕同时竞拍的物品太多可以存到数据库去,然后别人登录的时候拿出这个时间,计算时间差,用这个时间差来在页面上做倒计时,也是不关联程序的
展开全部
不要实时的更新数据库。
把time计时放在内存里做。
比如,一个拍品有一个 synchronized time, 竞价的时候更新这个值。但竞价结束以后,再更新数据库。
追问
我最初也是这么想的,但就怕一旦服务器出现问题,我这TIME就没处可找了。
我们这拍卖有点特殊,出问题了也得接着前面的继续拍。
追答
那可以考虑外部的分部式缓存,比如Redis,能持久化在硬盘上。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
页面上这么做
var intervalId = setInterval(function(){
if (time > 0)
{
time --;
//用js更新你的页面时间
}
else
{
//时间到了你要做的
clearInterval(intervalId);
}
},1000);
后台要使用内存,别尼玛那样搞数据库。老板骂死你的。
当有其他人访问要通知页面重新计时以及改变价格,这要用到“推”的技术,或者土鳖办法一直请求查看价格。
更多追问追答
追问
我也不想那么搞数据库啊。。。但我这个还有个要求的,出现意外情况也得接着前面的信息继续拍的。放在内存是好,我就怕服务器要是万一出个啥问题,我没法保存剩下的秒数。。。
追答
我次奥。。。服务器都出个啥子问题了你还存个秒数干蛋用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-20
展开全部
放到session或者application里面不可以吗?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询