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二級快取應用及與ehcache整合MyBatis快取
- Mybatis的二級快取、使用Redis做二級快取MyBatis快取Redis
- mybatis快取-二級快取MyBatis快取
- Mybatis二級快取使用MyBatis快取
- MyBatis快取機制(一級快取,二級快取)MyBatis快取
- MyBatis中的一級快取和二級快取介紹MyBatis快取
- mybatis快取之一級快取(二)MyBatis快取
- 被mybatis一級快取坑了MyBatis快取
- mybatis二級快取引數MyBatis快取
- Mybatis 整合 ehcache快取MyBatis快取
- mybatis原始碼學習:一級快取和二級快取分析MyBatis原始碼快取
- PHP APCu快取使用與避坑PHP快取
- Hibernate一級快取(session)與二級快取(sessionFactory)的知識點。快取Session
- mybatis基礎系列(四)——關聯查詢、延遲載入、一級快取與二級快取MyBatis快取
- Mybatis 二級快取應用 (21)MyBatis快取
- Mybatis一級快取MyBatis快取
- 淺談HTTP快取與CDN快取的那點事HTTP快取
- Mybatis的快取——一級快取和原始碼分析MyBatis快取原始碼
- Mybatis 一級快取和二級快取原理區別 (圖文詳解)MyBatis快取
- MySQL與Redis實現二級快取MySqlRedis快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- mybatis快取之一級快取(一)MyBatis快取
- hibernate的查詢快取和二級快取的配合使用快取
- Hibernate中一級快取和二級快取使用詳解快取
- spring boot redis做mybatis二級快取Spring BootRedisMyBatis快取
- hibernate(九) 二級快取和事務級別詳講快取
- Mybatis的快取MyBatis快取
- Hibernate的一級快取Session和二級快取SessionFactory快取Session
- MyBatis 快取MyBatis快取
- Mybatis快取MyBatis快取
- 快取原理與微服務快取自動管理快取微服務
- hibernate中lazy與二級快取問題快取
- myBatis原始碼解析-二級快取的實現方式MyBatis原始碼快取
- Web 快取機制 與 快取策略Web快取
- http快取與cdn快取配置指南HTTP快取
- 【MyBatis原始碼解析】MyBatis一二級快取MyBatis原始碼快取
- Spring Boot + Mybatis + Redis二級快取例項Spring BootMyBatisRedis快取
- 億級流量客戶端快取之Http快取與本地快取對比客戶端快取HTTP