15-一级缓存
目錄
- 一、Mybatis 中的緩存
- 1.什么是緩存
- 2.為什么使用緩存
- 3.什么樣的數據能使用緩存,什么樣的數據不能使用緩存
- 3.Mybatis 中的一級緩存和二級緩存
- 二、一級緩存
- 1.一級緩存測試
- Ⅰ測試類代碼
- Ⅱ輸出結果
- 2.關閉一級緩存
- Ⅰ第一種方法:
- Ⅱ第二種方法:
- 2.在兩個相同查詢中間進行增、刪、改
- Ⅰ改代碼
- 1.一級緩存測試
一、Mybatis 中的緩存
1.什么是緩存
存在內存中的臨時數據。
2.為什么使用緩存
減少與數據庫交互次數,提高執行效率
3.什么樣的數據能使用緩存,什么樣的數據不能使用緩存
適用于緩存:
不適用于緩存:
3.Mybatis 中的一級緩存和二級緩存
一級緩存:
二、一級緩存
一級緩存分析
一級緩存是 sqlsession 范圍的緩,當調用 sqlsession 的修改、添加、刪除、commit()、close()等方法時,就會清空一級緩存
1.一級緩存測試
Ⅰ測試類代碼
/*** 一級緩存*/@Testpublic void testFirstLevelCache(){User user1=userDao.findById(1);System.out.println(user1);User user2=userDao.findById(1);System.out.println(user2);System.out.println(user1==user2);}Ⅱ輸出結果
Opening JDBC Connection [DEBUG] 2019-08-16 10:37:32,206 method:org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) Created connection 11902257. [DEBUG] 2019-08-16 10:37:32,209 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:37:32,233 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:37:32,254 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@19dc67c2 [DEBUG] 2019-08-16 10:37:32,254 method:org.apache.ibatis.transaction.jdbc.JdbcTransaction.close(JdbcTransaction.java:90) Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@b59d31] [DEBUG] 2019-08-16 10:37:32,255 method:org.apache.ibatis.datasource.pooled.PooledDataSource.pushConnection(PooledDataSource.java:381) Returned connection 11902257 to pool. [DEBUG] 2019-08-16 10:37:32,255 method:org.apache.ibatis.transaction.jdbc.JdbcTransaction.openConnection(JdbcTransaction.java:136) Opening JDBC Connection [DEBUG] 2019-08-16 10:37:32,255 method:org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:416) Checked out connection 11902257 from pool. [DEBUG] 2019-08-16 10:37:32,256 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:37:32,256 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:37:32,257 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@62bd765 false可以看到上面的兩個對象是同一個,并且返回是 true
而且他只發起了一次查詢,第一次查詢,第二次是從緩存中取出
如果 sqlsession 關閉則一級緩存關閉
2.關閉一級緩存
兩種方法有所區別:
第一種方法是關閉 sqlsession ,重新建立一個
第二種是不關閉 sqlsession ,只清除緩存
Ⅰ第一種方法:
/*** 關閉一級緩存*/@Testpublic void testFirstLevelCache2(){User user1=userDao.findById(1);System.out.println(user1);sqlSession.close();//再次獲取 sqlsessionsqlSession= factory.openSession(true);userDao=sqlSession.getMapper(IUserDao.class);User user2=userDao.findById(1);System.out.println(user2);System.out.println(user1==user2);}輸出日志:
Opening JDBC Connection [DEBUG] 2019-08-16 10:37:32,255 method:org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:416) Checked out connection 11902257 from pool. [DEBUG] 2019-08-16 10:37:32,256 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:37:32,256 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:37:32,257 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@62bd765 falseⅡ第二種方法:
@Testpublic void testFirstLevelCache2(){User user1=userDao.findById(1);System.out.println(user1);sqlSession.clearCache();userDao=sqlSession.getMapper(IUserDao.class);User user2=userDao.findById(1);System.out.println(user2);System.out.println(user1==user2);}輸出日志:
Opening JDBC Connection [DEBUG] 2019-08-16 10:41:08,333 method:org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) Created connection 11902257. [DEBUG] 2019-08-16 10:41:08,336 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:41:08,365 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:41:08,386 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@19dc67c2 [DEBUG] 2019-08-16 10:41:08,387 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:41:08,389 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:41:08,392 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@62bd765 false2.在兩個相同查詢中間進行增、刪、改
一級緩存分析
一級緩存是 sqlsession 范圍的緩,當調用 sqlsession 的修改、添加、刪除、commit()、close()等方法時,就會清空一級緩存
Ⅰ改代碼
/*** 測試緩存的同步*/@Testpublic void testClearCache(){//1.根據 id 查詢用戶User user1=userDao.findById(1);System.out.println(user1);//2.跟新用戶信息user1.setUsername("update user");user1.setAddress("北京市海淀區");userDao.updateUser(user1);User user2=userDao.findById(1);System.out.println(user2);System.out.println(user1==user2);}輸出日志:
Opening JDBC Connection [DEBUG] 2019-08-16 10:56:30,917 method:org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(PooledDataSource.java:424) Created connection 11902257. [DEBUG] 2019-08-16 10:56:30,922 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:56:30,946 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:56:30,962 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@19dc67c2 [DEBUG] 2019-08-16 10:56:30,964 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: update user set username=?,address=? where id=? [DEBUG] 2019-08-16 10:56:30,964 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: update user(String), 北京市海淀區(String), 1(Integer) [DEBUG] 2019-08-16 10:56:30,982 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Updates: 1 [DEBUG] 2019-08-16 10:56:30,983 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Preparing: select *from user where id=? [DEBUG] 2019-08-16 10:56:30,983 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) ==> Parameters: 1(Integer) [DEBUG] 2019-08-16 10:56:30,984 method:org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:143) <== Total: 1 domain.User@78a2da20 false轉載于:https://www.cnblogs.com/zuiren/p/11406148.html
總結