mybatis二级缓存
mybatis 启用二级缓存:
<setting name="cacheEnabled" value="true"/>
<cache eviction="LRU" flushInterval="60000" size="1024" readOnly="true" />
一级缓存的作用域仅限于一个sqlsession,但是二级缓存的作用域是一个namespace。
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.defaults.DefaultSqlSessionFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.mgr.user.po.UserPO;
//mybatis二级缓存:不同的会话且查询语句相同且查询参数相同
/*
* 启用二级缓存<cache eviction="LRU" flushInterval="60000" size="1024" readOnly="true" />
eviction是缓存的淘汰算法,可选值有"LRU"、"FIFO"、"SOFT"、"WEAK",缺省值是LRU
flashInterval指缓存过期时间,单位为毫秒,60000即为60秒,缺省值为空,即只要容量足够,永不过期
ize指缓存多少个对象,默认值为1024
readOnly是否只读,如果为true,则所有相同的sql语句返回的是同一个对象(有助于提高性能,但并发操作同一条数据时,可能不安全),如果设置为false,则相同的sql,后面访问的是cache的clone副本。
上面这个是全局设置,在每条单独的sql语句上,还可以有局部设置,比如:
<select id="getOrder" parameterType="int" resultType="TOrder" useCache="false"> ... </select>
useCache="false"表示该select语句不使用缓存
一级缓存的作用域仅限于一个sqlsession,但是二级缓存的作用域是一个namespace。
但并不是意味着同一个namespace创建的mapper可以互相读取缓存内容,这里的原则是,
如果开启了二级缓存,那么在关闭sqlsession后,会把该sqlsession一级缓存中的数据添加到namespace的二级缓存中。
<setting name="cacheEnabled" value="true"/>
*/
public class CacheTest {
public static void main(String[] args) {
ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
DefaultSqlSessionFactory factory = (DefaultSqlSessionFactory)app.getBean("sqlSessionFactory");
mybatisSecondCache(factory); //二级缓存
//mybatisSecondCache2(factory);
}
/**
* mybatis二级缓存: 不同的会话且同一个mapper
* 查询语句相同且查询参数相同
* @param factory
*/
static void mybatisSecondCache(DefaultSqlSessionFactory factory){
SqlSession session = factory.openSession();
String statement = "cn.mgr.user.mapper.UserMapper.findByID";
UserPO user = new UserPO();
user.setUserId(100);
UserPO u = session.selectOne(statement, user);
System.out.println("第一次查询:"+u.getUserName());
session.close();
session = factory.openSession();
user = new UserPO();
user.setUserId(100);
u = session.selectOne(statement, user);
System.out.println("第二次查询:"+u.getUserName());
session.close();
}
/**
* mybatis二级缓存:
* 查询语句相同且查询参数不同
* @param factory
*/
static void mybatisSecondCache2(DefaultSqlSessionFactory factory){
SqlSession session = factory.openSession();
String statement = "cn.mgr.user.mapper.UserMapper.findByID";
UserPO user = new UserPO();
user.setUserId(100);
UserPO u = session.selectOne(statement, user);
System.out.println("第一次查询:"+u.getUserName());
session.close();
session = factory.openSession();
user = new UserPO();
user.setUserId(101);
u = session.selectOne(statement, user);
System.out.println("第二次查询:"+u.getUserName());
session.close();
}
}
推荐阅读
-
SpringBoot + Mybatis 增删改查实例教程详细解读
-
IntelliJ IDEA中使用mybatis-generator的示例
-
使用maven整合Spring+SpringMVC+Mybatis框架详细步骤(图文)
-
SpringMVC+Spring+Mybatis实现支付宝支付功能的示例代码
-
spring+springmvc+mybatis+maven入门实战(超详细教程)
-
mybatis输入映射和输出映射实例详解
-
mybatis防止SQL注入的方法实例详解
-
Mybatis实现分页的注意点
-
Java使用MyBatis框架分页的5种方式
-
Spring 整合 Hibernate 时启用二级缓存实例详解