二级缓存是映射级别的缓存,多个sqlSession对象操作同一个映射的sql,多个sqlSession对象可以公用二级缓存。
开启二级缓存:(在对应的映射文件中设置)
<mapper namespace="com.cn.dao.GoodsDao"> <!--开启二级缓存--> <cache></cache>
二级缓存需要给实体类设置序列化接口:
先在idea中设置:
实体类设置:
实体类添加序列化接口版本号:
(在类名上,alt+enter,选择第一个)
test:
//二级缓存 @Test public void testSelGoodsByGid2(){ //通过工具类获取第一个sqlSession对象 SqlSession session1 = SessionUtils.getSession(); GoodsDao mapper1 = session1.getMapper(GoodsDao.class); Goods goods1 = mapper1.selGoodsByGid(4); System.out.println(goods1); //关闭或提交第一个会话,第一个会话的数据就会被保存到二级缓存中去 // session1.close(); session1.commit(); System.out.println("------------"); //通过工具类获取第二个sqlSession对象 SqlSession session2 = SessionUtils.getSession(); GoodsDao mapper2 = session2.getMapper(GoodsDao.class); //因为开启了二级缓存,会从二级缓存中查询数据,查询到了数据,就不会执行sql语句 Goods goods2 = mapper2.selGoodsByGid(4); System.out.println(goods2); }
log4j:
DEBUG [main] - ==> Preparing: select * from t_goods WHERE gid = ? DEBUG [main] - ==> Parameters: 4(Integer) DEBUG [main] - <== Total: 1 Goods{gid=4, gname='冰箱', gprice=3155.55, gcount=30, gdate=Sat Aug 15 00:00:00 CST 2020} DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d2e5f00] DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@2d2e5f00] DEBUG [main] - Returned connection 758013696 to pool. ------------ DEBUG [main] - Cache Hit Ratio [com.cn.dao.GoodsDao]: 0.5 Goods{gid=4, gname='冰箱', gprice=3155.55, gcount=30, gdate=Sat Aug 15 00:00:00 CST 2020}
二级缓存生效条件:
第一个sqlSession对象被提交或关闭;
两个查询操作之间存在增删改操作(因为增删改操作都会有默认清空一级、二级缓存的配置:flushCache:“true”);