假设现在有线程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来调度的。
分享到:
相关推荐
DAO多线程的技巧(31KB)
这通常需要一个中间件(如MyCat、ShardingSphere等)来协调。 - **分布式事务**:在分布式系统中,可能需要处理跨数据库的事务,这时可以采用两阶段提交(2PC)、补偿事务(TCC)或基于Saga的分布式事务解决方案。 ...
这是因为这些方法必须在一个同步块内调用,并且调用它们的线程必须拥有该对象的锁。 ### 6. Sleep()、Suspend()、Wait()方法的区别 - **Thread.sleep()**:使当前正在执行的线程暂停执行指定时间,释放CPU但不释放...
1. **实体类(Entity)**:在这里,我们可以创建一个`Pet`类,它代表宠物对象,包含宠物的相关属性如ID、名称、品种等。 ```java public class Pet { private int id; private String name; private String ...
5. **InvalidMonitorStateException**:当一个线程未获得对象的锁时,试图调用wait()、notify()或notifyAll()会抛出此异常。这是因为在非同步上下文中调用这些方法是非法的。 6. **Sleep()、suspend()和wait()的...
在DAO中,通常需要根据业务需求来决定是让DAO自身负责事务管理还是将其委托给调用DAO的对象。例如,清单2展示了调用者管理事务的例子,其中事务的开始和结束都在DAO外部完成。 **异常处理**是确保系统稳定性和容错...
- `Thread.run()`只是一个普通方法,直接调用它不会启动新线程,而是在线程当前上下文中执行,相当于在主线程或其他已存在的线程中运行。 4. **什么是ThreadLocal类?如何使用?** `ThreadLocal`为每个线程提供了...
在本文中,我们将深入探讨如何使用Microsoft Foundation Class (MFC)库和Data Access Objects (DAO)来构建一个CGI(Common Gateway Interface)扩展服务器。CGI服务器是一种在Web服务器上运行的程序,它能接收HTTP...
`ThreadLocal`的中文名称为“线程局部变量”,它允许每个线程拥有变量的一个独立副本,确保了在多线程环境下变量的独立性,避免了线程之间的数据干扰。 线程安全问题通常出现在共享资源的并发环境中,例如,当多个...
在默认情况下,Spring使用传播行为`PROPAGATION_REQUIRED`,这意味着如果方法在一个事务中被调用,那么它也会在一个事务中执行。在`SecurityService`中的`checkUserInfo`方法中,即使没有显式地添加`@Transactional`...
DAO(Data Access Object)模式是一种常见的软件设计模式,它在应用程序和数据库之间提供了一层抽象,使得业务逻辑层与数据存储层分离。DAO的主要目的是为了简化数据库操作,提高代码的可测试性和可维护性。在这个...
- **SessionFactory**: 代表数据库会话工厂,是线程不安全的,通常在应用启动时创建,整个应用生命周期内只存在一个SessionFactory实例。 - **Session**: 数据库会话,处理与数据库的交互,它是线程绑定的,用于执行...
"Dao金山词霸"是一个专为C++开发者设计的数据库代码库,它提供了与金山词霸数据交互的能力,使得开发者能够轻松地在自己的应用中集成丰富的词汇资源。 Dao金山词霸的核心功能在于它的数据库操作接口,这些接口使得...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式操作数据库,极大地简化了数据库操作。在提供的代码片段中,我们可以看到一个`HibernateDao`类,它是对Hibernate...
Spring作为一个强大的依赖注入(DI)容器,常用于管理对象的生命周期和协作,而Ibatis则是一个轻量级的SQL映射框架,它简化了数据库操作,将SQL语句与Java代码分离。在这个场景下,我们关注的重点是如何在多线程环境...
在Excel文件中,Sheet是用于组织数据的单元,一个Excel文件可以包含多个Sheet。在Java中,我们可以使用Apache POI库来操作Excel文件,创建并填充多个Sheet。Apache POI提供了HSSFWorkbook(对应旧的.xls格式)和...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步。在很多情况下采用异步往往更有效率。 数据库三大范式? 答:1:确保每列都是不可分割的原子值 2...
DAO模式的引入解决了这个问题,它将数据库操作封装在独立的对象中,使得业务层只需要与这些对象交互,而无需直接操作数据库。 1. 数据库连接类:这是DAO模式的基础,负责建立和关闭数据库连接。通常,这个类会包含...
首先,简单工厂模式是一种用于创建对象的模式,它通过一个静态方法来生产对象,减少了客户端代码直接new对象的复杂性。然而,当产品种类增加时,简单工厂模式需要修改,这违背了开闭原则。为了解决这个问题,可以...
222 如何从文本文件中读取一个字符串? 第12章 文件与文件夹属-操作 223 如何判断文件只读属性? 224 如何设置文件只读属性? 225 如何判断文件隐藏属性? 226 如何设置文件隐藏属性? 227 如何判断文件归档属性? 228 ...