论坛首页 Java企业应用论坛

如何让在一个线程内DAO对象在一个时刻内只被调用一次?

浏览 9771 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (14) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-20  
public void run
0 请登录后投票
   发表时间:2008-04-21  
结合上面的讨论,经过自己尝试,发现无论是: synchronized(this){ },
还是将 DAO封装到一个方法,都不起作用。研究发现:
1)DAO在Spring的配置中缺省都是singleton的。service也是!!!
2)synchronized(this)是对这个TA对象加锁,这个也没用,因为我的TA对象是每次都初始化一个,拥有不同实例,synchronized(this)也没用。
最后,我的解决方法是:


[align=left][align=right][align=center][align=left]
public class TA extends Thread{ 
 private static final String done = "done";

BusinessDAO bDAO; 

public TA(BusinessDAO daoArg){ 
bDAO = daoArg; 
} 

public run(){ 
synchronized(done){
boolean b = bDAO.findExist(dataList); 
if(!b){ 
bDAO.insert(dataList); 
}else{ 
bDAO.update(dataList); 
} 
} 
} 
}
[/align][/align][/align][/align]

0 请登录后投票
   发表时间:2008-04-21  
kakaluyi 写道
javazhujf 写道
taikeqi 写道
可不可以这样做?
将方法
public run(){
boolean b = bDAO.findExist(dataList);
if(!b){
bDAO.insert(dataList);
}else{
bDAO.update(dataList);
}

改成

public run(){
synchronized(this){
boolean b = bDAO.findExist(dataList);
if(!b){
bDAO.insert(dataList);
}else{
bDAO.update(dataList);
}
}



run方法是属于某个线程的方法,不会涉及到多线程的并发。
发生问题的原因是有很多线程也就是很多run方法并发调用DAO或者说并发操作数据库,
所以解决问题的地方也是在DAO或者数据库。
向上面的修改方法我想是不起作用的

楼上的说错了吧?
synchronized(this)就是用来防止多线程共享资源的问题,像上面那样加锁,我觉的可行,不过要加事务提交,不然insert的dataList还是不存在吧,并等事务提交好再让另一个线程执行应该不会错的


每个线程好象都有自己的对象啊,synchronized(this)貌似锁不住吧?
0 请登录后投票
   发表时间:2008-04-22  

可能没个人都有自己理解,你们new 两个同样Thread对象start试试看锁的缩不住
楼主本来就是做个实验,一般Web开发中需要把共有对象的资源继承Thread类吗,本来讨论的就不是实际情况。
0 请登录后投票
   发表时间:2008-04-23  
同意楼上的观点。
这是一个并发的问题,解决的办法通过在线程中增加同步操作,可以解决并发中脏读问题,如何不是和数据库打交到,和其他资源(比如文件存储),我觉得这种方法比较合适。在一般Web应用中,数据库的并发问题,首先需要在事务中进行持久化操作,在事务开始以后,读取数据判断当前数据的状态,然后进行操作。同时需要设置事务隔离级别:RepeatableRead和Serializable都可以解决脏读的问题。
0 请登录后投票
   发表时间:2008-04-24  
万一是集群,那么sync代码段就没用了,最好还是加入事务,并提升隔离级别,我想数据库很少是分布式的吧?
也可以加一个timeStamp类型字段,然后实现一个乐观锁。
0 请登录后投票
   发表时间:2008-04-24  
楼上有见地,赞成
0 请登录后投票
   发表时间:2008-04-25  
这个问题的关键是datalist是怎么拿到的,数据库怎么定义的表还有ibats怎么定义find(datalist)返回true,如果是hibernate的话,如果datalist是自己生成的,那么你怎么find也找不到啊,因为key不一样,自然是新茶如一条。还是实验一下datalist什么情况下返回true在确定是不是同步问题,还是什么问题。
0 请登录后投票
   发表时间:2008-04-25  
这个问题的关键是datalist是怎么拿到的,数据库怎么定义的表还有ibats怎么定义find(datalist)返回true,如果是hibernate的话,如果datalist是自己生成的,那么你怎么find也找不到啊,因为key不一样,自然是新茶如一条。还是实验一下datalist什么情况下返回true在确定是不是同步问题,还是什么问题。
0 请登录后投票
   发表时间:2008-04-25  
用ThreatLocal 类设置一个全局变量可以解决这个问题把
0 请登录后投票
论坛首页 Java企业应用版

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