当前位置: 首页 > 编程笔记 >

Spring中DAO被循环调用的时候数据不实时更新的解决方法

申屠秦斩
2023-03-14
本文向大家介绍Spring中DAO被循环调用的时候数据不实时更新的解决方法,包括了Spring中DAO被循环调用的时候数据不实时更新的解决方法的使用技巧和注意事项,需要的朋友参考一下

在描述问题之前先说明几个前提,假设在Spring的配置文件中使用下面的方式配置了数据库的事务:

 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
   <property name="dataSource" ref="dataSource"/>
 </bean> 
 <tx:annotation-driven transaction-manager="transactionManager" />

现在有UserDao和SecurityService:

@Repository
 public class UserDao {
   public User getUser() {
     // query user from user table
     return queryObject("select * from user order by id desc limit 1");
   }
 }
@Service
 @Transactional
 public class SecurityService {
   @Autowired
   private UserDao userDao;
 
   public void checkUserInfo() {
     while(true) {
       User user = userDao.getUser();
       if(user != null && "Tom".equals(user.getName()) {
         System.out.println("Tom is here");
         break;
       }
     }
   }
 }

在调用SecurityService#checkUserInfo()方法的过程中,通过userDao#getUser()方法获取到的数据是不变的,即使这个时候新插入了一条name为Tom的数据循环也不会结束。另外将SecurityService上面的@Transactional注解去掉也无济于事。
首先想到会不会是数据库连接池的问题,换成了Spring自带的也是如此;然后从JdbcTemplate里面直接调用了Connection对象,使用原始的JDBC方式操作数据库,这个时候数据是实时变化的,于是想到应该是Spring的事务和当前操作线程进行绑定了。查看源代码进入之后果然在DataSourceUtils#doGetConnection方法里面发现了Spring在每个线程的每个DataSource上创建了一个Connection并且与事务进行了绑定。因为tx:annotation-driven配置文件对所有的Service层(加了@Service注解的类)进行了事务绑定,所以无论是否使用@Transactional都在同一个线程中绑定了同一个Connection,只是不进行事务操作而已。
经过多次实验和查找资料,最后终于找到了完美的解决方法:只要在上述的checkUserInfo方法中加上 @Transactional(propagation = Propagation.NOT_SUPPORTED) 注解就可以了。当然也可以获取到Connection然后手工进行操作,也可以使用DateUtils包进行操作。

 类似资料:
  • 我在php中工作,现在我正在将时循环应用于我的代码。我正在从数据库中获取数据。现在我必须将该数据应用于页面中的一个Div。 我的问题是"div类="项目活动"在循环中每次活动类都需要。现在我想改变它,就像在第一个循环过程之后,当第二个开始时,我想把那个div改变成这个"div类="项目"。 我对这个循环过程不太熟悉,所以我无法解决这个问题。需要帮助。谢谢

  • 问题内容: 当消化周期正在发生的事情,我很困惑,是基于每50ms定时器它定期调用(因为它说,在这里,并暗示在这里,或者它的每一个进入的角度范围内(因为它说,事件发生后呼吁在这里,在这里还有这里? 重要的示例: 在我的模型中,我有一个名为3的变量。在我的HTML中,我有。触发按钮单击之类的事件并在控制器中引发一个处理程序,该处理程序内的代码为: 假设UI线程未被阻止,则单击按钮后用户将看到什么?他只

  • 这是我的数据库表,数据库的记录id=1,昵称=测试,电子邮件=null 当我使用上述代码更新时,会出现错误列“昵称”不能为空! 我知道这是因为JPA必须先执行查找,但我不想在更新操作时给JPA所有不能为空的值。 其他说明: 假设我的前端只向我发送ID和电子邮件,我如何更新它?使用SQL是可行的,但JPA必须要求昵称不为null 如何解决这个问题?thx

  • 本文向大家介绍Spring中循环依赖的解决方法详析,包括了Spring中循环依赖的解决方法详析的使用技巧和注意事项,需要的朋友参考一下 前言 说起Spring中循环依赖的解决办法,相信很多园友们都或多或少的知道一些,但当真的要详细说明的时候,可能又没法一下将它讲清楚。本文就试着尽自己所能,对此做出一个较详细的解读。另,需注意一点,下文中会出现类的实例化跟类的初始化两个短语,为怕园友迷惑,事先声明一

  • 本文向大家介绍Python中循环后使用list.append()数据被覆盖问题的解决,包括了Python中循环后使用list.append()数据被覆盖问题的解决的使用技巧和注意事项,需要的朋友参考一下 前言 最近发现一个问题,在一次爬虫实战中,需要将字典加入列表中,意外的情况出现了!!!下面简单分析一下出现的状况: 结果出乎意料,并不是我们简单认为的 用我自己的理解是: 如上图,每一个dic都给

  • 本文向大家介绍Python跑循环时内存泄露的解决方法,包括了Python跑循环时内存泄露的解决方法的使用技巧和注意事项,需要的朋友参考一下 Python跑循环时内存泄露 今天在用Tensorflow跑回归做测试时,仅仅需要循环四千多次 (补充说一句,我在个人PC上跑的)。运行以后,我就吃饭去了。等我回来后,Console窗口直接亮红了!!! 此处忘了截图 ,反正就是说Keras出现了什么什么错误。