MyBatis 存在 一級 和 二級 緩存(默認一級緩存是開啟的)
一級緩存保存在 每個 Sqlsession 中 互不影響。 二級緩存保存在 于Mapper(namespace ) 中。
緩存數據什么周期: 在一級緩存存在于單次的事務,創建SQLSession 到 SQLSession.close緩存被銷毀,中間如果執行Commit命令,緩存同樣會被清空。 一級緩存單次事務 - 第一次: SqlSession.findUserById(1) 緩存(空) 查詢數據庫 - 第二次: SqlSession.findUserById(1) 緩存(有) 讀取 緩存 - 修改數據: SqlSession.commit() 緩存(自動清空) 數據被修改 - 第三次: SqlSession.findUserById(1) 緩存(空) 查詢數據庫 - 完成退出 SqlSession.close() 緩存(清空)
二級緩存 二級緩存 的域:使用 namespace 做為key,如果兩個mapper 使用同一 namespace做key 那么就會共用一個 二級緩存
二級緩存 開啟條件, 1、需要在 mapper.xml 中添加 <cache/>
標簽。 2、被緩存的對象需要實現序列號接口,否者會報錯。
測試:
public void selectOrder() throws IOException { String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession session = sqlSessionFactory.openSession(); OrderDaoLazy mapper = session.getMapper(OrderDaoLazy.class); User user = mapper.findUser(1); System.out.PRintln(user.toString()); session.close();//關閉后,一級緩存就會被銷毀,但是在同一namespace下,會保存在二級緩存內。 System.out.println("===================="); SqlSession session1 = sqlSessionFactory.openSession(); OrderDaoLazy mapper1 = session1.getMapper(OrderDaoLazy.class); User user1 = mapper1.findUser(1); System.out.println(user1.toString()); session.close(); }<cache/>
中有一個參數
具體可參見文檔 :(http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html) 跳入頁面 按 Ctrl+F 查找 flushInterval 可直接定位到。
新聞熱點
疑難解答