表示原来缓存在二级缓存中数据可以同步更新
为什么要使用二级缓存
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