/**
* 测试二级缓存,
* 二级缓存默认是关闭的,如果想使用二级缓存需要做如下两边操作:
* 1.开启二级缓存的总开关(在mybatis的配置文件中设置),这步可以不做,因为默认就开启的
*
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
2.开启指定mapper下的二级缓存(在mybatis的映射文件中设置)
<cache/>
*
* 注意点:
* A:只有在将第一次查询时使用的sqlSession提交后才会将查找到的对象存入到二级缓存中,否则不会自动存入。
* B:如果想将查询到的对象存入到二级缓存中,则必须让当前对象的类实现Serializable接口,否则报异常:
* Cause: org.apache.ibatis.cache.CacheException: Error serializing object.
* Cause: java.io.NotSerializableException: com.hsj.domain.Worker
*/
@Test
public void testGetWorkerByIdWithSecondCache() {
int id=1;
try {
SqlSession sqlSession1=MyBatisUtils.getSqlSession();
SqlSession sqlSession2=MyBatisUtils.getSqlSession();
//1.从数据库中查询信息并存入到一级缓存中
Worker worker1=sqlSession1.selectOne("com.hsj.dao.WorkerDao.getWorkerByIdWithSecondCache", id);
System.out.println("worker1="+worker1);
//2.如果想把查询的对象存入到二级缓存中,则必须调用当前sqlSession的commit()方法,否则不会将查询到的对象写入到二级缓存中
sqlSession1.commit();
System.out.println("=================");
Worker worker2=sqlSession2.selectOne("com.hsj.dao.WorkerDao.getWorkerByIdWithSecondCache", id);
System.out.println("worker2="+worker2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hsj.dao.WorkerDao">
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"
/>
........
</mapper>