二级缓存是映射级别的缓存,多个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”);