Hibernate之二级缓存实例用法

本次测试使用MyEclipse2017,利用内置Hibernate3.3框架进行二级缓存机制的测试。

本次测试建立Person实体类,SessionFactory.java,hibernate.cfg.xml,Person.bhm.xml均由MyEclipse自动生成。

配置好数据库中的table Person进行测试。


测试代码:

Session session=HibernateSessionFactory.getSession();

             Person person =(Person)session.get(Person.class,4);

             System.out.println(person.getPname());

             Person person1=(Person)session.get(Person.class, 4);

             System.out.println(person1.getPname());

             session.close();

结果:

此处出现一条查询语句,因为第一次的查询和第二次相同,第二次直接使用缓存中的数据。

Session session=HibernateSessionFactory.getSession();

             Person person =(Person)session.get(Person.class,4);

             System.out.println(person.getPname());

             Person person1=(Person)session.get(Person.class, 4);

             System.out.println(person1.getPname());

             session.close();

             

             Session session2=HibernateSessionFactory.getSession();

             person =(Person)session2.get(Person.class,4);

             System.out.println(person.getPname());

             session2.close();

结果:

此处新建session对象,使用同样的实体对象,出现了第二条语句,因为第一个session对象已被关闭,第二个对象新建产生,缓存已被清除,只能从数据库中重新查询获得值。

Hibernate查询策略:

条件查询的时候,先通过select * from table_nam查询数据库,一次过的所用数据对象,将获得的数据放入二级缓存中。

先到一级缓存去查数据,查不到,如果配置了二级缓存查询,就去二级缓存,再找不到就去数据库中查询,将结果通过id存入缓存中。

在删除更新增加数据时,同时更新缓存。

缓存策略主要针对ID查询的缓存策略,对属性查询则毫无作用,为此Hibernate针对条件查询订单Query Cache。

当服务器驱动时将公共部分数据全部放在二级缓存中。

一级:session级别的缓存,和session的生命周期共同存在,在这个周期中无论查询相同数据多少次只能进行一次查询语句。

二级:sessionFactory级别缓存,大数据公共全部使用sessionFacotry,为全局类型缓存,sessionFactory的生存方式相同。

SessionFactory提供evict方法

通过session设置缓存的模式

NORMAL 从二级缓存读写数据

GET 从二级缓存读取数据,仅在数据更新时对二级缓存写数据

PUT  只向二级缓存写数据,但不从二级读数据

适合放在缓存的数据:

很少被修改的数据,不是很重要的书库,允许出现偶尔并发的数据你不会被并发访问的数据,参考数据,指的是供应用参考的实例引用,实例极少或者从来不修改。

不适合存放到缓存的数据:经常被修改的数据,财务数据,不允许出现并发,与其他应用共享的数据。

缓存配置文件:

ehcache.xml:将文件放在src下

hibernate.properties:

进入cfg.xml中进行配置:

<property name="hibernate.cache.use_second_level_cache">true</property>//开启二级缓存

 <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>//修改缓存模式

<class-cache usage="read-only" class="cache.Person"/>//修改只读

在配置之后运行报错:

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

需要导入日志包commons-logging-1.1.3.jar。

由此开启二级缓存之后修改session对象也不会增加查询语句,只要在查询第一次数据后就会将数据存入二级缓存,一遍下次继续使用数据:

开启缓存也可在Person.hbm.xml中完成配置:

猜你喜欢

转载自blog.csdn.net/YuQuanZhang/article/details/81366643