mybatis缓存机制

一级缓存
	会话级缓存,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());
	    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章