礼品网站首选,万家企业共同的选择,价格更低!

Hibernate送礼【缓存】知识要点(4)

2018-03-13 11:00栏目:送礼艺术

这里写图片描述

usage的属性有4种:

<class-cache usage="read-only"/> 放入二级缓存的对象,只读;

<class-cache usage="nonstrict-read-write"/> 非严格的读写

<class-cache usage="read-write"/> 读写; 放入二级缓存的对象可以读、写;

<class-cache usage="transactional"/> (基于事务的策略)

集合缓存

如果我们在数据库查询的数据是集合...Hibernate默认是没有为集合数据设置二级缓存的...因此还是需要去读写数据库的信息

接下来,我们就看看把集合设置为二级缓存是什么做的:

在hibernate.cgf.xml中配置对象中的集合为二级缓存

<!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] --> <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>

测试代码:

public void testCache() { Session session1 = sf.openSession(); session1.beginTransaction(); // a. 查询一次 Dept dept = (Dept) session1.get(Dept.class, 10); dept.getEmps().size();// 集合 session1.getTransaction().commit(); session1.close(); System.out.println("------"); // 第二个session Session session2 = sf.openSession(); session2.beginTransaction(); // a. 查询一次 dept = (Dept) session2.get(Dept.class, 10); // 二级缓存配置好; 这里不查询数据库 dept.getEmps().size(); session2.getTransaction().commit(); session2.close(); }

查询缓存

list()和iterator()会把数据放在一级缓存,但一级缓存只在Session的作用域中有效...如果想要跨Session来使用,就要设置查询缓存

我们在配置文件中还看到了查询缓存这么一条配置..

#hibernate.cache.use_query_cache true 【开启查询缓存】

也就是说,默认的查询数据是不放在二级缓存中的,如果我们想要把查询出来的数据放到二级缓存,就需要在配置文件中开启

<!-- 开启查询缓存 --> 小女装店铺设计效果图大全2015图片欣赏_台湾都有哪些品牌女装<property name="hibernate.cache.use_query_cache">true</property>

在使用程序查询的时候,也要调用setCacheable()方法,设置为查询缓存。

@Test public void listCache() { Session session1 = sf.openSession(); session1.beginTransaction(); // HQL查询 【setCacheable 指定从二级缓存找,或者是放入二级缓存】 Query q = session1.createQuery("from Dept").setCacheable(true); System.out.println(q.list()); session1.getTransaction().commit(); session1.close(); Session session2 = sf.openSession(); session2.beginTransaction(); q = session2.createQuery("from Dept").setCacheable(true); System.out.println(q.list()); // 不查询数据库: 需要开启查询缓存 session2.getTransaction().commit(); session2.close(); }