教育行業(yè)A股IPO第一股(股票代碼 003032)

全國(guó)咨詢/投訴熱線:400-618-4000

Mybatis一級(jí)緩存、二級(jí)緩存

更新時(shí)間:2023年04月20日14時(shí)50分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

  Mybatis 是一個(gè)流行的Java ORM(Object-Relational Mapping)框架,用于將數(shù)據(jù)庫和Java對(duì)象之間進(jìn)行映射。Mybatis框架提供了一級(jí)緩存和二級(jí)緩存,以提高應(yīng)用程序的性能。

  一級(jí)緩存:

  Mybatis的一級(jí)緩存是默認(rèn)開啟的,它是指在同一個(gè)SqlSession對(duì)象中,如果執(zhí)行了相同的查詢語句,那么第二次執(zhí)行時(shí),Mybatis將會(huì)從緩存中獲取查詢結(jié)果,而不是再次去執(zhí)行SQL語句。這可以顯著提高查詢的性能。一級(jí)緩存是作用于SqlSession級(jí)別的,也就是在同一個(gè)SqlSession中執(zhí)行的查詢語句才會(huì)使用相同的緩存。

  下面是一個(gè)簡(jiǎn)單的代碼演示:

SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 第一次查詢
User user1 = userMapper.selectById(1);
// 第二次查詢,從緩存中獲取結(jié)果
User user2 = userMapper.selectById(1);

  在上面的代碼中,第一次查詢時(shí),Mybatis會(huì)執(zhí)行SQL語句并將結(jié)果存入緩存。第二次查詢時(shí),Mybatis會(huì)從緩存中獲取結(jié)果,而不是再次執(zhí)行SQL語句。

  二級(jí)緩存:

  Mybatis的二級(jí)緩存是作用于Mapper級(jí)別的。它可以將同一個(gè)Mapper下的查詢結(jié)果緩存到內(nèi)存中,以減少對(duì)數(shù)據(jù)庫的訪問次數(shù)。當(dāng)多個(gè)SqlSession對(duì)象都使用同一個(gè)Mapper時(shí),它們可以共享這個(gè)緩存。二級(jí)緩存默認(rèn)是關(guān)閉的,需要手動(dòng)進(jìn)行配置。

  下面是一個(gè)簡(jiǎn)單的代碼演示:

// 配置 UserMapper.xml 文件
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

// 在 Mybatis 配置文件中啟用二級(jí)緩存
<settings>
  <setting name="cacheEnabled" value="true"/>
</settings>

SqlSession sqlSession1 = sqlSessionFactory.openSession();
UserMapper userMapper1 = sqlSession1.getMapper(UserMapper.class);
// 第一次查詢,從數(shù)據(jù)庫中獲取結(jié)果
User user1 = userMapper1.selectById(1);

// 開啟新的 SqlSession
SqlSession sqlSession2 = sqlSessionFactory.openSession();
UserMapper userMapper2 = sqlSession2.getMapper(UserMapper.class);
// 第二次查詢,從緩存中獲取結(jié)果
User user2 = userMapper2.selectById(1);

  在上面的代碼中,第一次查詢時(shí),Mybatis會(huì)執(zhí)行SQL語句并將結(jié)果存入緩存。第二次查詢時(shí),Mybatis會(huì)從緩存中獲取結(jié)果,而不是再次執(zhí)行SQL語句。這是因?yàn)榈诙€(gè)SqlSession對(duì)象與第一個(gè)SqlSession對(duì)象共享同一個(gè)Mapper的二級(jí)緩存。需要注意的是,為了使用二級(jí)緩存,需要將Mapper對(duì)象進(jìn)行序列化,否則會(huì)出現(xiàn)序列化異常。

0 分享到:
和我們?cè)诰€交談!