Mybatis整合二級快取與同時使用快取與事務存在的坑
今天在看分散式事務的時候,突然收到app不能簽到的訊息,趕緊解決。
具體解決方法:
1、把執行錯誤的處理方法提取出來,作為測試方法
2、這個方法裡面有兩個插入語句,一條查詢語句,一個更新語句,涉及到三張表。
3、報錯資訊為
"nested exception is org.apache.ibatis.exceptions.PersistenceException: n### Error committing transaction. Cause: java.lang.NullPointerException: Can't serialize nulln### Cause: java.lang.NullPointerException: Can't serialize null
4、今天只是為了做叢集,將Mybatis的快取由預設的記憶體快取改為了Memcached,突然就報這個錯。
思路
插入語句一般不會快取,只有Select語句才會快取。不能持久化,我只用了一個選擇語句,這個語句是執行正常的啊,檢視日誌,發現問題。
Flushing keys: [_mybatis_22a025828e62efbe0adda93d10f748e15fe8cecd]
Flushing group: _mybatis_2610d3ffc622c90f08b859a4e787189c9230d66e
每次插入或更新語句的時候都會Flush cache,導致剛查詢的快取結果為清空,因為加了事務註解,所以等方法執行完畢的時候,快取為null,然後報錯。
教訓
在事務處理的時候,如果是使用Memcache做快取,儘量不要把Select語句和Insert語句放到一起。
如果是使用Redis作為Mybatis的快取,則未發現問題。
額外
Mybatis二級快取的擴充套件包中檔案數量較少,並且官方的Mybatis-Redis直接使用,當前版本也會報錯,無法整合。
解決方案:
將所有Mybatis-redis擴充套件包複製到當前專案
二級快取包中檔案
修改Rediscache的構建方法
public RedisCache(final String id) { if (id == null) { throw new IllegalArgumentException("Cache instances require an ID"); } this.id = id; RedisConfig redisConfig = RedisConfigurationBuilder.getInstance().parseConfiguration(); pool = new JedisPool(redisConfig, redisConfig.getHost(), redisConfig.getPort(), redisConfig.getConnectionTimeout(), redisConfig.getSoTimeout(), redisConfig.getPassword(), redisConfig.getDatabase(), redisConfig.getClientName(),false,null,null,null); }
可以使用Redis作為Mybatis的二級快取,在Mybatis全域性配置與Mapper檔案中配置好即可。
整合Mybatis-Memecache也類似,可以複製二級快取包內容,進行擴充套件
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/36/viewspace-2817186/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- mybatis快取-二級快取MyBatis快取
- Mybatis二級快取使用MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- Mybatis的二級快取MyBatis快取
- mybatis快取之一級快取(二)MyBatis快取
- 被mybatis一級快取坑了MyBatis快取
- mybatis二級快取引數MyBatis快取
- Hibernate一級快取(session)與二級快取(sessionFactory)的知識點。快取Session
- Mybatis 整合 ehcache快取MyBatis快取
- mybatis原始碼學習:一級快取和二級快取分析MyBatis原始碼快取
- PHP APCu快取使用與避坑PHP快取
- mybatis基礎系列(四)——關聯查詢、延遲載入、一級快取與二級快取MyBatis快取
- Mybatis 二級快取應用 (21)MyBatis快取
- 淺談HTTP快取與CDN快取的那點事HTTP快取
- Mybatis的快取——一級快取和原始碼分析MyBatis快取原始碼
- Mybatis 一級快取和二級快取原理區別 (圖文詳解)MyBatis快取
- MySQL與Redis實現二級快取MySqlRedis快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- mybatis快取之一級快取(一)MyBatis快取
- Mybatis的快取MyBatis快取
- MybatisPlus二級快取MyBatis快取
- MyBatis 快取MyBatis快取
- myBatis原始碼解析-二級快取的實現方式MyBatis原始碼快取
- 探討下如何更好的使用快取 —— Redis快取的特殊用法以及與本地快取一起構建多級快取的實現快取Redis
- http快取與cdn快取配置指南HTTP快取
- Web 快取機制 與 快取策略Web快取
- 快取原理與微服務快取自動管理快取微服務
- 億級流量客戶端快取之Http快取與本地快取對比客戶端快取HTTP
- 瀏覽器的快取機制—強快取與協商快取瀏覽器快取
- 深入理解 MyBatis的二級快取的設計原理MyBatis快取
- 304與快取快取
- MyBatis的快取玩法MyBatis快取
- mybatis原始碼詳細解析(2)---- 一級,二級快取MyBatis原始碼快取
- 快取架構中的服務詳解!SpringBoot中二級快取服務的實現快取架構Spring Boot
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- 05、MyBatis 快取MyBatis快取