一级缓存
会话级缓存,SqlSession 级别,默认是开启
清除一级缓存对象
commit();
session.clearCache();
@Test
public void query() {
BookMapper bm = session.getMapper(BookMapper.class);
System.out.println(bm.queryAll());
System.out.println(bm.queryAll());//一级缓存
session.commit();
System.out.println(bm.queryById(3));
//session.clearCache();
System.out.println(bm.queryById(3));//一级缓存
//session.commit();
System.out.println(bm.queryById(3));
System.out.println(bm.queryById(3));
}
二级缓存
SqlSessionFactory级别缓存,会话工厂级别
SqlSession s1 = sf.openSession();
SqlSession s2 = sf.openSession();
SqlSession s3 = sf.openSession();
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
开发者必须自己配置二级缓存
二级缓存是人工开启的,需要在XxxxMapper.xml 文件中加入如下开启
方法一
<cache eviction="FIFO" flushInterval="60000" size="5120" readOnly="true" />
<select id="queryAll" resultType="book" useCache="false"> 默认使用缓存,填写false此操作不让缓存
select * from book
</select>
方法二
@CacheNamespace(eviction = FifoCache.class, flushInterval = 60000, size = 1024, readWrite = true)
public interface BookMapper {
@Select("select * from book") @Options(useCache = true)
public List<Book> queryAll();
@Select("select * from book where id = #{id}")
public Book queryById(int id);
}
注意:使用缓存时,最好给实体类序列化。
java是什么是序列化?会什么不序列化?
测试代码为:
@Test
public void ccc() throws IOException, ClassNotFoundException {
SqlSession s1 = sf.openSession();
SqlSession s3 = sf.openSession();
//一级缓存
//BookMapper bm1 = s1.getMapper(BookMapper.class);
//BookMapper bm2 = s1.getMapper(BookMapper.class);
//System.out.println(bm1.queryAll());
//System.out.println(bm2.queryAll());
//二级缓存
BookMapper bm1 = s1.getMapper(BookMapper.class);
//bm1.queryById(3);
System.out.println(bm1.queryAll());
s1.commit();//二级缓存才生效
//sf.getConfiguration().getCaches().clear();
//s1.getConfiguration().getCaches().clear();
sf.getConfiguration().getCaches().clear();;
SqlSession s2 = sf.openSession();
BookMapper bm2 = s2.getMapper(BookMapper.class);
System.out.println(bm2.queryAll());//读取二级缓存
//Book bk = new Book();
//bk.setId(1000);
//bk.setPrice(80);
//bk.setName("《java开发入门》");
//请把bk保存到硬盘上,首先确认bk实现序列化接口
//ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:/a.dat"));
//oos.writeObject(bk);
//oos.close();
//反序列化
//ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:/a.dat"));
//Book bk = (Book)ois.readObject();
//System.out.println(bk);
//System.out.println(bk.getName());
}