Spring中DAO被輪回挪用的時刻數據不及時更新的處理辦法。本站提示廣大學習愛好者:(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包停止操作。