最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中DAO被循環(huán)調(diào)用的時(shí)候數(shù)據(jù)不實(shí)時(shí)更新的解決方法

 更新時(shí)間:2014年08月28日 11:52:36   投稿:mdxy-dxy  
這篇文章主要介紹了Spring中DAO被循環(huán)調(diào)用的時(shí)候數(shù)據(jù)不實(shí)時(shí)更新的解決方法,需要的朋友可以參考下

在描述問題之前先說明幾個(gè)前提,假設(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ù)是不變的,即使這個(gè)時(shí)候新插入了一條name為Tom的數(shù)據(jù)循環(huán)也不會(huì)結(jié)束。另外將SecurityService上面的@Transactional注解去掉也無濟(jì)于事。
首先想到會(huì)不會(huì)是數(shù)據(jù)庫連接池的問題,換成了Spring自帶的也是如此;然后從JdbcTemplate里面直接調(diào)用了Connection對(duì)象,使用原始的JDBC方式操作數(shù)據(jù)庫,這個(gè)時(shí)候數(shù)據(jù)是實(shí)時(shí)變化的,于是想到應(yīng)該是Spring的事務(wù)和當(dāng)前操作線程進(jìn)行綁定了。查看源代碼進(jìn)入之后果然在DataSourceUtils#doGetConnection方法里面發(fā)現(xiàn)了Spring在每個(gè)線程的每個(gè)DataSource上創(chuàng)建了一個(gè)Connection并且與事務(wù)進(jìn)行了綁定。因?yàn)閠x:annotation-driven配置文件對(duì)所有的Service層(加了@Service注解的類)進(jìn)行了事務(wù)綁定,所以無論是否使用@Transactional都在同一個(gè)線程中綁定了同一個(gè)Connection,只是不進(jìn)行事務(wù)操作而已。
經(jīng)過多次實(shí)驗(yàn)和查找資料,最后終于找到了完美的解決方法:只要在上述的checkUserInfo方法中加上 @Transactional(propagation = Propagation.NOT_SUPPORTED) 注解就可以了。當(dāng)然也可以獲取到Connection然后手工進(jìn)行操作,也可以使用DateUtils包進(jìn)行操作。

相關(guān)文章

最新評(píng)論

乐陵市| 武强县| 会昌县| 抚顺市| 松滋市| 阿拉善左旗| 利津县| 蓝田县| 萨迦县| 平顶山市| 颍上县| 鞍山市| 遵义县| 邢台市| 昭觉县| 清水河县| 江西省| 扶沟县| 得荣县| 德庆县| 彭山县| 隆林| 桃园县| 泊头市| 龙门县| 大厂| 沈丘县| 梨树县| 新巴尔虎右旗| 小金县| 平塘县| 宾川县| 福州市| 外汇| 英吉沙县| 梅河口市| 巴彦县| 益阳市| 绥中县| 绍兴市| 文成县|