程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring中DAO被輪回挪用的時刻數據不及時更新的處理辦法

Spring中DAO被輪回挪用的時刻數據不及時更新的處理辦法

編輯:關於JAVA

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包停止操作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved