Mybatis缓存
来源:互联网 发布:蚂蚁网络电视安卓版 编辑:程序博客网 时间:2024/06/05 03:33
Mybatis缓存
1.一级缓存
Mybatis一级缓存为sqlSession级别的缓存,默认开启,相同的sqlsession对象,查询相同条件的结果时,存在一级缓存只会查询一次,sqlSession关闭后缓存失效 调用cleanCache后 缓存被清除,执行过增删改后缓存会被清除,不能跨session。
<mapper namespace="lesson05.StudentMapper"> <select id="queryStudent" resultType="student"> select * from student where sid=#{0} </select> </mapper>public static SqlSession getSession() throws IOException{ String resource = "lesson05/mybatis.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); //工厂类 SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); return sqlSessionFactory.openSession(); } public void query() throws IOException{ SqlSession session = getSession(); StudentMapper stu=session.getMapper(StudentMapper.class); Student s=stu.queryStudent("2"); StudentMapper stu1=session.getMapper(StudentMapper.class); Student s1=stu1.queryStudent("2"); System.out.println(s==s1); }
返回的结果是true,说明两次查询取到的是同一个对象,这就证明存在一级缓存只会查询一次,一级缓存是不可被更改的
2. 二级缓存
二级缓存的全局开关(mybatis.xml): <settings> <setting name="cacheEnabled" value="true"></setting> </settings>
使用配置: `<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="t`rue"> </cache>
注意事项:session必须是同一个SqlSessionFactory创建的,如果是多个session操作同一个数据,只能有一个session操作,其他都要关闭。
3.redis缓存
通过实现Cache接口,并且重写其中的方法实现
工具类package lesson05;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import com.sun.xml.internal.messaging.saaj.util.ByteInputStream;import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;public class JedisUtils { /** * 序列化 * @throws IOException */ public static byte[] objectToByteArray(Object obj) throws IOException{ ByteOutputStream bos = new ByteOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); return bos.getBytes(); } /** * 反序列化 * @throws Exception */ public static Object byteArrayToObject(byte[] bt) throws Exception{ ByteInputStream bid = new ByteInputStream(bt, bt.length); ObjectInputStream ois = new ObjectInputStream(bid); return ois.readObject(); }}实现类package lesson05;import java.io.IOException;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;import org.apache.ibatis.cache.Cache;import redis.clients.jedis.Jedis;public class RedisCache implements Cache { Jedis jedis = new Jedis("localhost",6379); /** * 缓存的id */ private String cacheId; public RedisCache(String cacheId){ this.cacheId=cacheId; } /** * 清除redis数据库,不建议实现 */ @Override public void clear() { //jedis.flushAll(); } @Override public String getId() { return cacheId; } /** * mybatis读取数据时 将数据库中读取的数据通过putObject设置到缓存中 */ @Override public void putObject(Object key, Object value) { try { jedis.set(JedisUtils.objectToByteArray(key), JedisUtils.objectToByteArray(value)); } catch (IOException e) { e.printStackTrace(); } } /** * mybatis自动调用getObject检测是否有缓存 */ @Override public Object getObject(Object key) { try { byte [] bt=jedis.get(JedisUtils.objectToByteArray(key)); if(bt==null){ return null; } return JedisUtils.byteArrayToObject(bt); } catch (Exception e) { e.printStackTrace(); } return null; } /** * mybatis缓存策略删除数据 */ @Override public Object removeObject(Object key) { Object obj = getObject(key); try { jedis.del(JedisUtils.objectToByteArray(key)); } catch (IOException e) { e.printStackTrace(); } return obj; } @Override public int getSize() { // TODO Auto-generated method stub return 0; } /** * 加锁 */ @Override public ReadWriteLock getReadWriteLock() { return new ReentrantReadWriteLock(); }}配置文件<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" type="lesson05.RedisCache"> </cache>
阅读全文
1 0
- MyBatis-缓存
- MyBatis 缓存
- mybatis缓存
- mybatis缓存
- MyBatis 缓存
- mybatis 缓存
- mybatis缓存
- MyBatis缓存
- MyBatis缓存
- MyBatis 缓存
- mybatis 缓存
- Mybatis缓存
- mybatis 缓存
- Mybatis缓存
- MyBatis 缓存
- mybatis缓存
- MyBatis缓存
- Mybatis缓存
- python生成器函数以及生成器表达式
- java详解 --- 进制、变量、运算符及流程控制
- CNN中1x1卷积的用处和优点
- MCP,eMMC,eMCP区别和联系
- node.js 创建服务器及客户端
- Mybatis缓存
- chap1 lambda 表达式
- 拦截器和过滤器监听器的区别执行顺序
- 将指定的form表单中所有的输入项转为json数据{key:value,key:value}
- VS调试时断点无法进入或命中的原因及解决方法(PDB引发的)
- 大O符号
- hdu3333Turing Tree
- 在用vtk8.0.0进行编程时,发现拾取actor时总是不对
- java: 正则匹配字符串中多个目标子串(贪婪匹配的模拟实现)