首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 基于hibernate多线程操作同一张表
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • diracstar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2007-07-02 09:29:52 楼主
    项目描述:短信平台
    问题描述:MySql数据库中有一张“queue”的表,用作消息发送对列,在发送端,有多个发送线程同时访问这张表,取出消息发送,发送成功后删除该条消息,同时存入另外一张日志表“log”。由于发送需要时间,又因为采用多线程,因此在某个线程发送某条消息的时候,由于还没有删除该条消息,导致其它线程有可能重复发送。举例子:线程A取消息A开始发送,在线程A发送消息A过程中,线程B有可能也取消息A发送,造成重复发送。这里我们用的是Hibernate请问该如何同步锁定,或者有什么更好的方法。请教大家,不甚感激。
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zqrqq
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-02 09:43:401楼 得分:0
    方法1,
    首先,确保“queue”表是用InnoDB形式存储的,以支持事务
    然后,在“queue”表增加一个标志位,读取的时候设定位一个中间状态
    然后,等待短消息发送完毕后,在把这条记录删除掉
    最后,一条数据处理完毕后提交事务


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • diracstar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-02 10:13:272楼 得分:0
    我设置了一个标志位state,但是我采用的是批量处理,一次处理50-100条,所以到事务提交前,标志位没有改变。这个过程中,别的线程可能对其重复操作,存在并发问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • diracstar
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-02 10:36:233楼 得分:0
    每条短信都有一个标志位,我采用的是批量处理,一次处理50-100条,所以到事务提交前,标志位没有改变。这个过程中,别的线程可能对其重复操作,所以存在并发问题。即使采用一开始就删除,由于这里采用批量处理,这样在事务提交前,问题仍然存在,即其它线程可能重复操作。实际运行结果是:比如实际进到对列中是2213条消息,但实际发出了2813条消息。原先发送线程只有一个,一次批量处理100条,减少对数据库的访问,这样是正常的,但同时遇到的问题是,出口速率偏慢,效率不高,导致对列拥塞。所以现在考虑增加发送的线程,但是遇到这个同步的问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hisunbeam
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-02 18:07:244楼 得分:0
    各线程可以都通过单例设计模式使用hibernate的同一个session对数据操作,这样就不会出现数据不同步的问题了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gameboy999
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-04 11:22:405楼 得分:0
    select   for   update..
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yushuidingdang_20
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-13 09:38:146楼 得分:0
    本身设计就有问题,所以为题就复杂了,用一个线程来读就足够了!短信的瓶颈不在这里!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Octer
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-15 22:30:117楼 得分:0
    加一个标志字段,线程取到带发送消息首先update这个字段(比如标示这条短信被线程占用),如果update结果反回为0说明,线程未取到,如此反复,直到取道,然后线程发送消息,如果发送成功,则delete然后log,否则置回原始状态
    等待分配给其他线程
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zyg158
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-17 17:48:068楼 得分:0
    采用多级缓存机制

    queue发送总表
    每个线程一个临时发送表,每个线程分别读取和删除自己临时子表中的数据
    tmp_queue_0001...tmp_queue_0010

    设计一个单线程,循环检测每个线程的临时表,检测到数据记录数为0时,
    从queue表中取得100条记录,插入到子表,并同时从queue中删除记录
    (这个过程中使用事务操作)

    这个方式应该完全满足你的应用
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ochinchina
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-07-18 17:10:469楼 得分:0
    一张数据库表一个操作线程,多个短信发送线程,这样就不会有问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sacrefies
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2007-09-29 02:29:4210楼 得分:0
    You can call the method setLockMode() of a opened Hibernate Session object.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hust12519
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-03-03 21:59:3211楼 得分:0
    Hibetnate 的setLockMode()没有用过,不知道如何。
    采用 for update的查询会锁整个表
    但是如果是我,我感觉可以采用两个Message池来完成该功能。
    一个池负责提供Message实例对象
    另外一个池负责把发送成功的Message固化到DB中,并记录log

    相当于自己去控制锁。
     
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • solong1980
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-28 21:03:3012楼 得分:0
    我觉得简单问题,量起来后也会边的复杂
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • meiZiNick
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-01 15:09:1013楼 得分:0
    等待牛人来答.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenciitc
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-05-09 14:38:2714楼 得分:0
    发表于:2008-05-09 13:40:51 楼主

    北京思源培训中心(http://www.ciitc.com)专业做软件开发技术的培训;由于课程培训需要,长年高薪诚聘兼职讲师,欢迎计算机及相关专业的高校老师、研究生、博士生应聘   
    基本要求如下:
    l    本科以上学历,计算机或相关专业毕业。
    2    具有实际相关工作经验,从事过软件开发或系统管理工作。
    3    语言表达清楚、流畅、逻辑思维清晰,英语听说良好。
    4    诲人不倦,有高度的责任感、敬业精神和团队意识。
    5    注重仪表,具有随机应变的能力。
    6    具有一定的教学经验,从事过教学/培训业务者优先考虑。

    精通应聘职位的某一部分课程内容,如下述编程语言或系统的一种或几种:
    1.    编程语言:C++, VC++,VB.NET,C#, PowerBuilder, Delphi, Java,
      Matlab , C++Builder
    2.    数据库系统:SQL Server2000, SQL Server2005, Oracle,DB2,MySql
    3.    网站编程:Marcomedia, HTML, Altova XML Suite,ASP, JSP, J2EE, J2SE,
        PHP,ASP.NET,VB.NET, ColdFusion,ajax
    4.    操作系统:Unix, Linux,Linux环境下嵌入式开发技术,Sun Solaris,IBM AIX
    5.      办公软件:OFFICE(EXCEL、WORD、POWERPOINT)
    6.      多媒体制作:Authorware7.0  , Director MX 2004
    7.      图形动画类:Photoshop, Illustrator, CorelDRAW, FreeHand, 
    Flash ActionScript高级编程,3DMAX,AutoCAD2007 ,Maya
    具有下述任何一种或几种国际IT认证证书者优先考虑:
    1.    微软认证证书MCP / MCSA / MCSE / MCDBA / MCSD
    2.    SUN Java认证证书
    3.    Oracle认证证书
    4.    Macromedia认证证书
    5.    Linux认证证书
    6.    CIW (Certified Internet Webmaster) Associate/Professional/Master认证证书

    有意者请把简历发到如下地址:abc@ciitc.com  QQ:174629429  MSN:bjcosun@hotmail.com
    http://www.ciitc.com



    问题点数:20 回复次数:0 显示所有回复显示星级回复显示楼主回复 修改 删除 举报 引用 回复 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wenxiang_tune
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-28 12:34:0915楼 得分:0
    什么~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • victorpgx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-13 00:27:3716楼 得分:0
    过度设计,6楼,9楼说得在理
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tomato2088
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-21 14:17:5017楼 得分:0
    这么简单的入门级问题都搞不定,连概念都没搞清楚!!
    还自称在做"平台".

    建议好好学习MySQL 和 Tomcat源代码,看看如何处理成千上万的线程服务的.

    oracle,weblogic 就先不要提了.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved