国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

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

2019-11-26 15:26:56
字體:
供稿:網(wǎng)友

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 八宿县| 肃南| 海城市| 沅江市| 奉新县| 庆阳市| 天台县| 丰都县| 金塔县| 贵定县| 共和县| 八宿县| 肇源县| 积石山| 广丰县| 大港区| 湘潭县| 昌黎县| 达孜县| 西乌珠穆沁旗| 扶余县| 剑川县| 西乌珠穆沁旗| 辛集市| 平乡县| 渭源县| 丹江口市| 通渭县| 神农架林区| 淳安县| 满洲里市| 巴林左旗| 吉水县| 珲春市| 白城市| 金寨县| 石首市| 石狮市| 阿克苏市| 鹿泉市| 慈利县|