gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Spring中DAO被循环调用的时候数据不实时更新的解决方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

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

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

现在有UserDao和SecurityService:

?
1
2
3
4
5
6
7
@Repository
  public class UserDao {
    public User getUser() {
      // query user from user table
      return queryObject( "select * from user order by id desc limit 1" );
    }
  }
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@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包进行操作.

最后此篇关于Spring中DAO被循环调用的时候数据不实时更新的解决方法的文章就讲到这里了,如果你想了解更多关于Spring中DAO被循环调用的时候数据不实时更新的解决方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com