深入理解Mybatis一級緩存
客戶端向數(shù)據(jù)庫服務器發(fā)送同樣的sql查詢語句,如果每次都去訪問數(shù)據(jù)庫,會導致性能的降低。
那么怎么提高呢?
mybatis為我們提供了一級緩存的策略
在一個sqlSession開啟和關(guān)閉之間,sqlSession對象內(nèi)部(其實是Executor)會維護一個緩存的對象,當查詢數(shù)據(jù)時候,先從緩存中尋找是否存在該條數(shù)據(jù),存在就直接取出來,不存在,向數(shù)據(jù)庫發(fā)送sql查詢, 然后將查詢后的數(shù)據(jù)存入緩存,和返回給程序。
這樣會存在一個問題:
如果在第一次和第二次查詢期間,有程序更改了要查訊的數(shù)據(jù)庫的數(shù)據(jù),就會引起讀取的數(shù)據(jù)是錯誤的,也就是
臟讀,其實是mybatis在sqlSession執(zhí)行commit()方法后會清空這個緩存。第二次去查詢,依然會從數(shù)據(jù)庫中查詢.
也可以手動調(diào)用sqlSession的clearCache()方法清除緩存
小例子:
@Test public void testCacheLever1() throws Exception{ SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); //第一次請求,查詢id為1的用戶 User user = mapper.findUserById(1); System.out.println(user); //更改數(shù)據(jù),會清空緩存 user.setUsername("yyyy"); mapper.updateUser(user); session.commit(); //第二次查詢會從緩存中找 User user2 = mapper.findUserById(1); System.out.println(user2); session.close(); }
問題:
如果sqlSession關(guān)閉了,緩存也就清空了。這怎么使用緩存來提高效率呢?
好了,下篇文章給大家介紹mybatis二級緩存。
以上所述是小編給大家介紹的Mybatis一級緩存,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
解決spring-data-jpa 事物中修改屬性自動更新update問題
這篇文章主要介紹了解決spring-data-jpa 事物中修改屬性自動更新update問題,具有很好的參考價值,希望對大家2021-08-08java使用泛型實現(xiàn)棧結(jié)構(gòu)示例分享
泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時要指明泛型的具體類型,這樣就避免了類型轉(zhuǎn)換。本實例將使用泛型來實現(xiàn)一個棧結(jié)構(gòu),并對其進行測試2014-03-03SpringBoot Mybatis動態(tài)數(shù)據(jù)源切換方案實現(xiàn)過程
這篇文章主要介紹了SpringBoot+Mybatis實現(xiàn)動態(tài)數(shù)據(jù)源切換方案過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-04-04hibernate中HQL如何調(diào)用自定義函數(shù)
這篇文章主要介紹了hibernate中HQL如何調(diào)用自定義函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09