您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页Hibernate二级缓存

Hibernate二级缓存

来源:化拓教育网
 http://www.itfuture.org 未来蓝图软件教育中心

二级缓存的配置

一、二级缓存的配置文件

名称:ehcache.xml 配置:

name=\"org.hibernate.cache.StandardQueryCache\" name=\"org.hibernate.cache.UpdateTimestampsCache\"

maxElementsInMemory=\"50\" maxElementsInMemory=\"5000\"

eternal=\"false\" timeToIdleSeconds=\"3600\" timeToLiveSeconds=\"7200\" overflowToDisk=\"true\"/> eternal=\"true\" overflowToDisk=\"true\"/>

配置解释

表示如果把二级缓存的数据存到磁盘上的话,那么存放的位置的设定,把io存放文件的位置作为二级缓存在磁盘上存放的位置。

<defaultCache

name=\"org.hibernate.cache.StandardQueryCache\"

maxElementsInMemory=\"10000\" <!-- 缓存最大元素数目 -->

eternal=\"false\" <!-- 缓存是否持久保存,即不保存到数据库也不保存到磁盘 --> overflowToDisk=\"true\" <!—如果超出缓存最大量,是否保存到磁盘 -> timeToIdleSeconds=\"3600\" <!-- 当缓存闲置n秒后销毁 --> timeToLiveSeconds=\"7200\" <!-- 当缓存存活n秒后销毁-->

diskPersistent=\"false\"

diskExpiryThreadIntervalSeconds= \"120\"/> </ehcache>

第 1 页 共 7 页

name=\"org.hibernate.cache.UpdateTimestampsCache\" maxElementsInMemory=\"5000\"

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

eternal=\"true\" overflowToDisk=\"true\"/>

二、使用二级缓存

<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 --> name=\"cache.provider_class\">org.hibernate.cache.EhCacheProvider

true

三、缓存策略(配置在PO的hbm影射文件)

只能对缓存中数据进行读不能编辑。表示原来缓存在二级缓存中数据不能因相应对象的更新而同

步更新,而并不表示(只能把读数据缓存,而写的数据不能缓存)。

表示原来缓存在二级缓存中数据可以同步更新

为什么要使用二级缓存

session

session可以对对象进行增删改查功能实现

1、一个session中放过多的持久态po对象,在执行flush和transaction时,会影响性能 2、一个session会对应一个一级缓存,另一个session不能使用其它session一级缓存中的数据 3、由以上推出必须要使用二级缓存提高hibenate的性能

(1)、二级缓存是基于 SessionFactory工厂,一个SessionFactory的二级缓存中存的数据,凡是基于该SessionFactory 创建的session,都可以使用该二级缓存中存的数据(共享)

(2)、在具体session的执行flush或transaction提交时,不会把二级缓存中存的数据同步到数据库,提高了session的执行flush或transaction提交时效率 4、什么时候会使用二级缓存(存,取)

基于SessionFactory的二级缓存,会把通过SessionFactory创建的session查询时的数据存入二级缓存;如果通过session查数据时,先到session一级缓存中查找(根据po的标示符identifier)如果查不到的话,设query.setCachable(true),该查询,会到二级缓存中去找,如果 二级缓存还找不到话,会生成sql到库中查;如果最终到数据库查了,

第 2 页 共 7 页

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

而且设定了query.setCachable(true),接着把查到的数据对象还要缓存到一/二级缓存 5、一般一个po需要配置一个二级缓存配置;当然可以配置一个标准缺省的二级缓存配置,所有po都使用该缺省配置 6、不缓存相关联对象

二级缓存对当前查询的对象进行缓存,如果该对象有个属性是Set容器(盛放是相关的PO对象),不对set容器中对象缓存,但对set容器当中每个对象的标示符(identifier)进行缓存(二级缓存),如果想再查该set容器中的对象, hibernate会以identifier为条件产生一个sql到数据库查询。

二级缓存的具体应用

public static void querycache() {

//加载配置文件(hibernate.propertis,hibernate.cfg.xml) Configuration conf=new Configuration();

conf.configure();

SessionFactory f=conf.buildSessionFactory(); Session session =f.openSession();

//Query q=session.createQuery(\"from java.lang.Object\"); Query q=session.createQuery(\"select A from DeptPo A where q.setCacheable(true); List list=q.list();

for(Iterator iter=list.iterator();iter.hasNext();) {

Object obj=iter.next(); System.out.println(obj);

//DeptPo po=(DeptPo)iter.next();

A.deptid<20\");

//System.out.println(po.getDeptid()+\"---\"+po.getDeptname()+\"---\"+po.getDeptnum()+\"---\"+po.getDeptdesc());

}

session.close();

System.out.println(\"*****************************************************\");

session =f.openSession();

第 3 页 共 7 页

q=session.createQuery(\"select A from DeptPo A where A.deptid<20\"); q.setCacheable(true); list=q.list();

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

for(Iterator iter=list.iterator();iter.hasNext();) {

Object obj=iter.next(); System.out.println(obj);

//DeptPo po=(DeptPo)iter.next();

//System.out.println(po.getDeptid()+\"---\"+po.getDeptname()+\"---\"+po.getDeptnum()+\"---\"+po.getDeptdesc());

f.close();

//java.sql.Connection conn=session.connection(); }

public static void Criteriacache() {

//加载配置文件(hibernate.propertis,hibernate.cfg.xml) Configuration conf=new Configuration(); }

conf.configure();

SessionFactory f=conf.buildSessionFactory(); Session session =f.openSession();

//Query q=session.createQuery(\"from java.lang.Object\"); Criteria

c.setCacheable(true); List list=c.list();

for(Iterator iter=list.iterator();iter.hasNext();) {

Object obj=iter.next(); System.out.println(obj);

//DeptPo po=(DeptPo)iter.next();

c=session.createCriteria(DeptPo.class).add(Expression.lt(\"deptid\",20));

//System.out.println(po.getDeptid()+\"---\"+po.getDeptname()+\"---\"+po.getDeptnum()+\"---\"+po.getDeptdesc());

}

session.close();

System.out.println(\"*****************************************************\");

session =f.openSession();

c=session.createCriteria(DeptPo.class).add(Expression.lt(\"deptid\",20));

第 4 页 共 7 页

c.setCacheable(true); list=c.list();

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

for(Iterator iter=list.iterator();iter.hasNext();) {

Object obj=iter.next(); System.out.println(obj);

//DeptPo po=(DeptPo)iter.next();

//System.out.println(po.getDeptid()+\"---\"+po.getDeptname()+\"---\"+po.getDeptnum()+\"---\"+po.getDeptdesc());

f.close();

//java.sql.Connection conn=session.connection(); }

public static void loadcache() {

//加载配置文件(hibernate.propertis,hibernate.cfg.xml) Configuration conf=new Configuration(); }

conf.configure();

SessionFactory f=conf.buildSessionFactory(); Session session =f.openSession();

//Query q=session.createQuery(\"from java.lang.Object\"); Object obj=session.load(DeptPo.class,1);

System.out.println(obj); session.close();

System.out.println(\"*****************************************************\");

session =f.openSession(); System.out.println(obj);

obj=session.load(DeptPo.class,1); session.close();

第 5 页 共 7 页

f.close();

//java.sql.Connection conn=session.connection(); }

public static void writecache() {

//加载配置文件(hibernate.propertis,hibernate.cfg.xml) Configuration conf=new Configuration();

conf.configure();

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

SessionFactory f=conf.buildSessionFactory(); Session session =f.openSession();

DeptPo po=new DeptPo(800,\"aaac\",20,\"asdfasd\"); Transaction tran=session.beginTransaction(); session.save(po); tran.commit(); session.close();

System.out.println(\"*****************************************************\");

session =f.openSession(); System.out.println(obj);

Object obj=session.load(DeptPo.class,800); session.close();

f.close();

//java.sql.Connection conn=session.connection(); }

//缓存更新

public static void updatecache() {

//加载配置文件(hibernate.propertis,hibernate.cfg.xml) Configuration conf=new Configuration();

conf.configure();

SessionFactory f=conf.buildSessionFactory(); Session session =f.openSession();

DeptPo po=(DeptPo)session.load(DeptPo.class,800);//放到二级缓存中 po.setDeptname(\"策划部2\");

Transaction tran=session.beginTransaction(); session.update(po); tran.commit(); session.close();

System.out.println(\"*****************************************************\");

第 6 页 共 7 页

session =f.openSession();

po=(DeptPo)session.load(DeptPo.class,800); System.out.println(po.getDeptname());

www.itfuture.org

http://www.itfuture.org 未来蓝图软件教育中心

session.close();

f.close();

//java.sql.Connection conn=session.connection(); }

(1)一级缓存对象数据——>二级缓存 SessionFactory 二级缓存 Session1 一级缓存 Session2 Session3 一级缓存 一级缓存 (2)二级缓存—->一级缓存进行处理(如果当前修改的对象来自二级缓存,修改成功后,二级缓存中该对象也要变化)

二级缓存 session 一级缓存 进行修改

第 7 页 共 7 页

www.itfuture.org

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务