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

假设现在有线程TA,TA里的run()方法会调用一个DAO借口实现,DAO里会对一个表进行判断,然后写操作。
public class TA extends Thread{
BusinessDAO bDAO;

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

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

请问我现在如何做到就是run()方法体内的代码在一个时刻内只有一个实例在运行?也就是说
bDAO.insert(dataList);这行代码在运新的时候,系统内只有一个dataList被传入,然后跟我的数据库系统已有的数据比较,然后得出结论,然后更新数据库状态。
这样做的原因是我现在的系统老是出现这样的情况,连续传2次dataList,按说第一次判断系统中没有这个datalist后,将这个dataList的值写入到数据库,那么第2次应该会判断出已经有了这个数据,但是实际情况不是,第二次判断仍然得出是没有的结论。而且在传入多次的情况下,结果都是一样。
这种结果从表面上看来就好像2次上传,第一次和第二次毫无关系一样,难道是2次是并发执行了?

请问这可能是什么原因造成的?那么我如何控制这种并发,保证我第一次判断,然后写入,然后才执行我第二次判断,第二次写入。
这个bug跟我的数据库的事务设置有关吗?
怎么解决这个问题? 还是要将我的程序设置成Singleton模式的? 怎么将我的程序设置成singleton模式的?

我的程序的实际架构是:Struts1.2+Spring2.0+iBatis3,以上的代码我抽象了一下。 线程TA是通过Spring的
org.springframework.core.task.TaskExecutor来调度的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值