论坛首页 Java企业应用论坛

基于hibernate多线程操作同一张表

浏览 10022 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-02  
项目背景:短信平台
问题描述:MySql数据库中有一张“queue”的表,用作消息发送对列,在发送端,有多个发送线程同时访问这张表,取出消息发送,发送成功后删除该条消息,同时存入另外一张日志表“log”。由于发送需要时间,又因为采用多线程,因此在某个线程发送某条消息的时候,由于还没有删除该条消息,导致其它线程有可能重复发送。举例子:线程A取消息A开始发送,在线程A发送消息A过程中,线程B有可能也取消息A发送,造成重复发送。这里我们用的是Hibernate请问该如何同步锁定,或者有什么更好的方法。请教大家,不甚感激。
   发表时间:2007-07-02  
事务隔离级别定成repeatable read或更严格的sequence
0 请登录后投票
   发表时间:2007-07-02  
你发送短信的设备或软件可以同时发送多条吗,如果可以同时发多条,那最好在发送消息的线程开始就把取到的那条记录删了,如果发送失败再添加到数据库队列中或再次发送。
这样才能实现多线程同时发送不同的消息。

如果同时只能有一条在发送,就没必要用多线程了。
0 请登录后投票
   发表时间:2007-07-02  
首先谢谢大家。
可以同时发送多条,有数个联通号码,移动号码,小灵童号码,消息取出来,往空闲的号码上发送,但是不宜一开始酒删除,因为如果发生仁何意外,消息发送不成功,会导致消息丢失。
“事务隔离级别定成repeatable read或更严格的sequence”,请问能否讲详细些,只有一个表,实际上我是希望能对一行记录锁定,就是一个线程操作一条记录的时候,对其锁定,别的线程不可对其操作,这样才能保证不会重复。
0 请登录后投票
   发表时间:2007-07-02  
如果不把前面的删除,那你怎么取出后面的消息呢?

总之,你长时间锁定表,不是好的方法。
0 请登录后投票
   发表时间:2007-07-02  
每条短信都有一个标志位,我采用的是批量处理,一次处理50-100条,所以到事务提交前,标志位没有改变。这个过程中,别的线程可能对其重复操作,所以存在并发问题。即使采用一开始就删除,由于这里采用批量处理,这样在事务提交前,问题仍然存在,即其它线程可能重复操作。实际运行结果是:比如实际进到对列中是2213条消息,但实际发出了2813条消息。原先发送线程只有一个,一次批量处理100条,减少对数据库的访问,这样是正常的,但同时遇到的问题是,出口速率偏慢,效率不高,导致对列拥塞。所以现在考虑增加发送的线程,但是遇到这个同步的问题。
0 请登录后投票
   发表时间:2007-07-02  
取发送记录这件事让一个线程去做,别的线程只管发送等接下来的工作
0 请登录后投票
   发表时间:2007-07-02  
这的确是个办法,但仔细想一下,要等到发送线程 将消息发送出去之后 才会修改标志位然后存入log,然后最后从queue中删除, 那么这个过程中,读写数据库的线程仍然会重复操作
0 请登录后投票
   发表时间:2007-07-02  
读写数据库各一个线程,发送多个线程,读写队列各一,发送队列一

发送线程从读队列取消息(从队列删除),入发送队列,发送,成功后从发送队列删除,存入写队列
写线程反复从写队列中取,修改标志位,存log
读线程监听读队列,当该队列为空时,从数据库取消息(可批量),条件为标志位正确,并且不在上面三个队列中
0 请登录后投票
   发表时间:2007-07-02  
diracstar 写道
...先发送线程只有一个,一次批量处理100条,减少对数据库的访问,这样是正常的,但同时遇到的问题是,出口速率偏慢,效率不高,导致对列拥塞。所以现在考虑增加发送的线程,但是遇到这个同步的问题。



如果是发送速率本身的瓶颈,导致队列拥塞,增加发送线程就可以加快吗?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics