Spring中DAO被循環(huán)調(diào)用的時候數(shù)據(jù)不實時更新的解決方法
在描述問題之前先說明幾個前提,假設(shè)在Spring的配置文件中使用下面的方式配置了數(shù)據(jù)庫的事務(wù):
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="transactionManager" />
現(xiàn)在有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;
}
}
}
}
在調(diào)用SecurityService#checkUserInfo()方法的過程中,通過userDao#getUser()方法獲取到的數(shù)據(jù)是不變的,即使這個時候新插入了一條name為Tom的數(shù)據(jù)循環(huán)也不會結(jié)束。另外將SecurityService上面的@Transactional注解去掉也無濟于事。
首先想到會不會是數(shù)據(jù)庫連接池的問題,換成了Spring自帶的也是如此;然后從JdbcTemplate里面直接調(diào)用了Connection對象,使用原始的JDBC方式操作數(shù)據(jù)庫,這個時候數(shù)據(jù)是實時變化的,于是想到應(yīng)該是Spring的事務(wù)和當(dāng)前操作線程進行綁定了。查看源代碼進入之后果然在DataSourceUtils#doGetConnection方法里面發(fā)現(xiàn)了Spring在每個線程的每個DataSource上創(chuàng)建了一個Connection并且與事務(wù)進行了綁定。因為tx:annotation-driven配置文件對所有的Service層(加了@Service注解的類)進行了事務(wù)綁定,所以無論是否使用@Transactional都在同一個線程中綁定了同一個Connection,只是不進行事務(wù)操作而已。
經(jīng)過多次實驗和查找資料,最后終于找到了完美的解決方法:只要在上述的checkUserInfo方法中加上 @Transactional(propagation = Propagation.NOT_SUPPORTED) 注解就可以了。當(dāng)然也可以獲取到Connection然后手工進行操作,也可以使用DateUtils包進行操作。
- struts2+spring+ibatis框架整合實現(xiàn)增刪改查
- 在Spring使用iBatis及配置講解
- java~springboot~ibatis數(shù)組in查詢的實現(xiàn)方法
- springboot 多模塊將dao(mybatis)項目拆分出去
- Spring Boot下如何自定義Repository中的DAO方法
- Java的MyBatis+Spring框架中使用數(shù)據(jù)訪問對象DAO模式的方法
- Java的Spring框架中DAO數(shù)據(jù)訪問對象的使用示例
- spring的jdbctemplate的crud的基類dao
- Spring如何集成ibatis項目并實現(xiàn)dao層基類封裝
相關(guān)文章
java父子節(jié)點parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整
這篇文章主要介紹了java父子節(jié)點parentid樹形結(jié)構(gòu)數(shù)據(jù)的規(guī)整,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07
java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)圖片轉(zhuǎn)base64字符串,java實現(xiàn)base64字符串轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問題
這篇文章主要介紹了完美解決Spring Boot前端的Access-Control-Allow-Origin跨域問題,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
使用Spring注解@EventListener實現(xiàn)監(jiān)聽原理
這篇文章主要介紹了使用Spring注解@EventListener實現(xiàn)監(jiān)聽原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
Java INPUTSTREAM如何實現(xiàn)重復(fù)使用
這篇文章主要介紹了Java INPUTSTREAM如何實現(xiàn)重復(fù)使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10

