首页 > 编程知识 正文

hibernate二级缓存机制(hibernate缓存集群)

时间:2023-05-03 20:15:55 阅读:71550 作者:4784

一. Hibernate提供的缓存

有l1缓存、l2缓存。 目的是减少对数据库的访问次数,提高程序的执行效率!

二.初级缓存

基于会话的缓存,缓存内容仅在当前会话中有效,会话关闭,缓存内容无效!

特点:

作用范围小! 缓存的事件很短。

缓存效果不明显。

三.二级缓存

Hibernate提供了跨多个会话的APP应用程序级高速缓存。 这意味着可以从不同的会话访问缓存数据。 此交换也称为l2缓存。

Hibernate提供的l2缓存是缺省实现的,是一个可插件的缓存框架。 用户想使用l2缓存时,可以用hibernate.cfg.xml配置; 不想使用,直接删除,不影响代码。

如果用户觉得难以使用hibernate提供的框架框架,可以自己更换其他缓存框架,也可以自己实施缓存框架。

四.二级缓存配置

查看hibernate.properties配置文件时,l2缓存是如何配置的?

# # # #

# # #第二级缓存# # #

# # # #

# hibernate.cache.use _ second _ level _ cache false【L2缓存缺省情况下不打开,必须手动打开】

# hibernate.cache.use _ query _ cache true【打开查询缓存】

# chooseacacheimplementation【实现L2缓存框架】

# hibernate.cache.provider _ class org.hibernate.cache.ehcache provider

# hibernate.cache.provider _ class org.hibernate.cache.emptycacheprovider

hibernate.cache.provider _ class org.hibernate.cache.hashtablecacheprovider的缺省实现

# hibernate.cache.provider _ class org.hibernate.cache.treecacheprovider

# hibernate.cache.provider _ class org.hibernate.cache.oscache provider

# hibernate.cache.provider _ class org.hibernate.cache.swarmcacheprovider

五.二级缓存,使用步骤

1 )打开l2缓存

2 )指定缓存框架

3 )指定那些类参与辅助缓存,类写全名

4 )测试

测试2级缓存!

六.缓存策略

放入class-cache usage='只读'/L2缓存中的对象,只读;

类- cache usage=' non strict-read-write ' /不严格读写

class-cache usage='读-写' /读写; 放入二级缓存的对象可以读写;

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

七.集合缓存

! -集合缓存[集合缓存中的元素对象,也添加到辅助缓存中]

collection-cache

usage='读-写' collection=' cn.lf senior.b _ second _ cache.dept.emps ' /

八.查询缓存

list ) )默认情况下进入缓存,而不是从一级缓存中提取!

使用查询缓存,可以从辅助缓存中检索list )查询!

1、打开查询缓存后,查询的list (或可以从次缓存获取数据(list ) )不能从主缓存[会话缓存]获取数据),但会主动获取

queryq=session1. create query (' from dept ' ).setcacheable ) http://www.Sina.com/);

系统. out.println (q.list ) );

完整案例:

ify">2、二级、集合缓存配置可以在*.hbm.xml文件也可以在*.cfg.xml中配置,一般推荐使用后者,便于统一维护

 Hibernate.cfg.xml

<!--****************** 【二级缓存配置】****************** --><!-- a. 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- b. 指定使用哪一个缓存框架(默认提供的) --><property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property><!-- 开启查询缓存 --><property name="hibernate.cache.use_query_cache">true</property><!-- c. 指定哪一些类,需要加入二级缓存 --><class-cache usage="read-write" class="cn.lfsenior.b_second_cache.Dept"/><class-cache usage="read-only" class="cn.lfsenior.b_second_cache.Employee"/><!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] --><collection-cache usage="read-write" collection="cn.lfsenior.b_second_cache.Dept.emps"/>
App  测试类

public class App {private static SessionFactory sf;static {sf = new Configuration().configure().addClass(Dept.class) .addClass(Employee.class) // 测试时候使用.buildSessionFactory();}// 1. 测试二级缓存的使用// 没有/有用 二级缓存@Testpublic 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("------");// 第二个sessionSession session2 = sf.openSession();session2.beginTransaction();// a. 查询一次dept = (Dept) session2.get(Dept.class, 10); // 二级缓存配置好; 这里不查询数据库dept.getEmps().size();session2.getTransaction().commit();session2.close();}@Testpublic 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();}}
也可在*.hbm.xml文件中配置

将当前类二级缓存(class节点下):

       <cache usage="read-only"/>

将当前类下的set集合加入集合缓存(set节点下):

       <cache usage="read-only"/>

<hibernate-mapping package="cn.lfsenior.entry" > <class name="Dept" table="t_dept" ><cache usage="read-only"/><id name="deptId"><generator class="native" /></id><property name="deptName" length="20"></property><!-- 1对多配置 --><set name="emps" ><!-- 外键配置 --><cache usage="read-only"/><key column="dept_id"></key><one-to-many class="Employee"/></set> </class></hibernate-mapping> 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。