码迷,mamicode.com
首页 > 其他好文 > 详细

Mybatis学习笔记-一级缓存与二级缓存

时间:2014-09-30 22:11:41      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:缓存

1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session被flush或close之后,该session中的所有Cache就将清空。

2.二级缓存与一级缓存机制相同,默认也采用PerpetualCache HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。

3.对于缓存数据更新机制,当一个作用域(一级缓存session/二级缓存Namespace )进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear.


User.java 实体类

public class User {
	private int id;
	private String username;
	private int age;
	private String sex;
	//...
}


<select id="getUser" parameterType="int" resultType="com.mybatis.test07.User">
	select * from users where id = #{id}
</select>

<update id="updateUser" parameterType="com.mybatis.test07.User">
	update users set username = #{username}, age = #{age} where id = #{id}
</update>


测试

		SqlSessionFactory factory = MybatisUtil.getFactory();
		SqlSession session = factory.openSession();
		
		String statement = "com.mybatis.test06.userMapper.getUser";
		User user = session.selectOne(statement, 2);
		System.err.println(user);
		
		user = session.selectOne(statement, 2);
		System.err.println(user);
		session.close();
		//默认情况下一级缓存已开启。两次查询同一个对象,只会进行一次select操作
		SqlSessionFactory factory = MybatisUtil.getFactory();
		SqlSession session = factory.openSession(true);
		
		String statement = "com.mybatis.test07.userMapper.getUser";
		User user = session.selectOne(statement, 2);
		System.err.println(user);
		
		//进行update操作
		user.setId(11);
		statement = "com.mybatis.test07.userMapper.updateUser";
		System.err.println(user);
		session.update(statement, user);
		
		//重新发出查询
		statement = "com.mybatis.test07.userMapper.getUser";
		user = session.selectOne(statement, 2);
		System.err.println(user);
		session.close();
		SqlSessionFactory factory = MybatisUtil.getFactory();
		SqlSession session = factory.openSession(true);
		
		String statement = "com.mybatis.test07.userMapper.getUser";
		User user = session.selectOne(statement, 2);
		System.err.println(user);
		
		SqlSession session1 = factory.openSession(true);	
		user = session1.selectOne(statement, 2);
		System.err.println(user);
		session.close();
		session1.close();
		//两个不同的session对象


三种情况不能利用一级缓存:①执行了session.clearCache(); ②执行了CUD操作 ③不是同一个session对象


二级缓存以namespace为单元,即以映射文件为单元。Hibernate二级缓存以SessionFactory为单元。

在映射文件中加入 <cache/> 即可

		SqlSessionFactory factory = MybatisUtil.getFactory();
		SqlSession session = factory.openSession();
		
		String statement = "com.mybatis.test07.userMapper.getUser";
		User user = session.selectOne(statement, 2);
		System.err.println(user);
		//User(com.mybatis.test07.User@1a78071) [id=2, username=syd, age=34, sex=男]
		session.commit();
		
		SqlSession session1 = factory.openSession();	
		user = session1.selectOne(statement, 2);
		System.err.println(user);
		//User(com.mybatis.test07.User@182ef6b) [id=2, username=syd, age=34, sex=男]
		session1.commit();
		session.close();
		session1.close();


两次不是同一个对象,但是第二次并没有从数据库中去查询。


1.映射语句文件中的所有select语句将会被缓存

2.映射语句文件中所有的insert update delete语句会刷新缓存

3.缓存会使用Least Recently Used (LRU 最近最少使用) 算法来收回

4.缓存会根据指定的时间间隔来刷新

5.缓存会存储1024个对象

本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1560167

Mybatis学习笔记-一级缓存与二级缓存

标签:缓存

原文地址:http://shamrock.blog.51cto.com/2079212/1560167

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!