当前位置: 移动技术网 > IT编程>开发语言>Java > Spring中DAO被循环调用的时候数据不实时更新的解决方法

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

关于祖国的文章,安妮娅·谢苗诺维奇,安徽船舶倾覆事故

在描述问题之前先说明几个前提,假设在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包进行操作。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网