日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

15-一级缓存

發(fā)布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 15-一级缓存 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一、Mybatis 中的緩存
    • 1.什么是緩存
    • 2.為什么使用緩存
    • 3.什么樣的數(shù)據(jù)能使用緩存,什么樣的數(shù)據(jù)不能使用緩存
    • 3.Mybatis 中的一級緩存和二級緩存
  • 二、一級緩存
    • 1.一級緩存測試
      • Ⅰ測試類代碼
      • Ⅱ輸出結(jié)果
    • 2.關(guān)閉一級緩存
      • Ⅰ第一種方法:
      • Ⅱ第二種方法:
    • 2.在兩個相同查詢中間進(jìn)行增、刪、改
      • Ⅰ改代碼

一、Mybatis 中的緩存

1.什么是緩存

存在內(nèi)存中的臨時數(shù)據(jù)。

2.為什么使用緩存

減少與數(shù)據(jù)庫交互次數(shù),提高執(zhí)行效率

3.什么樣的數(shù)據(jù)能使用緩存,什么樣的數(shù)據(jù)不能使用緩存

適用于緩存:

  • 經(jīng)常查詢并且不經(jīng)常改變。
  • 數(shù)據(jù)的正確與否對最終結(jié)果影響不大的。
  • 不適用于緩存:

  • 經(jīng)常改變的數(shù)據(jù)。
  • 數(shù)據(jù)的正確與否對最終結(jié)果影響很大。
  • 例如:商品的庫存,銀行的匯率,股市的牌價。
  • 3.Mybatis 中的一級緩存和二級緩存

    一級緩存:

  • 它指的是 Mybatis 中 SqlSession 對象的緩存。
  • 當(dāng)我們執(zhí)行查詢之后,查詢的結(jié)果會同時存入到 SqlSession 為我們提供一塊區(qū)域中。
  • 該區(qū)域的結(jié)構(gòu)時一個 Map 。當(dāng)我們再次查詢同樣的數(shù)據(jù),mybatis 會先去 sqlsession 中查詢是否有,有的話直接拿出來用。
  • 當(dāng) SqlSession 對象消失時,mybatis 的一級緩存也就消失了。
  • 二、一級緩存

    一級緩存分析

    一級緩存是 sqlsession 范圍的緩,當(dāng)調(diào)用 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);}

    Ⅱ輸出結(jié)果

    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

    而且他只發(fā)起了一次查詢,第一次查詢,第二次是從緩存中取出

    如果 sqlsession 關(guān)閉則一級緩存關(guān)閉

    2.關(guān)閉一級緩存

    兩種方法有所區(qū)別:

    第一種方法是關(guān)閉 sqlsession ,重新建立一個

    第二種是不關(guān)閉 sqlsession ,只清除緩存

    Ⅰ第一種方法:

    /*** 關(guān)閉一級緩存*/@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 false

    2.在兩個相同查詢中間進(jìn)行增、刪、改

    一級緩存分析

    一級緩存是 sqlsession 范圍的緩,當(dāng)調(diào)用 sqlsession 的修改、添加、刪除、commit()、close()等方法時,就會清空一級緩存

    Ⅰ改代碼

    /*** 測試緩存的同步*/@Testpublic void testClearCache(){//1.根據(jù) id 查詢用戶User user1=userDao.findById(1);System.out.println(user1);//2.跟新用戶信息user1.setUsername("update user");user1.setAddress("北京市海淀區(qū)");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), 北京市海淀區(qū)(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

    轉(zhuǎn)載于:https://www.cnblogs.com/zuiren/p/11406148.html

    總結(jié)

    以上是生活随笔為你收集整理的15-一级缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。