EJB3缓存 JPA环境下使用Hibernate二级缓存

hibernate二级缓存本质上分为两类:
1.对象 缓存
2.查询缓存

在JPA环境下,例如Jboss,底层还是通过Hibernate来实现JPA的Query。

下边简单说一下配置的步骤:

1.配置entity
在实体上方加入@Cache
Java代码
收藏代码
  1. importjava.io.Serializable;
  2. importjavax.persistence.Entity;
  3. importjavax.persistence.GeneratedValue;
  4. importjavax.persistence.Id;
  5. importjavax.persistence.Table;
  6. importorg.hibernate.annotations.Cache;
  7. importorg.hibernate.annotations.CacheConcurrencyStrategy;
  8. @Entity
  9. @Table
  10. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
  11. publicclassUserimplementsSerializable{
  12. privatestaticfinallongserialVersionUID=-5121812640999313420L;
  13. privateIntegerid;
  14. privateStringname;
  15. @Id
  16. @GeneratedValue
  17. publicIntegergetId(){
  18. returnid;
  19. }
  20. publicvoidsetId(Integerid){
  21. this.id=id;
  22. }
  23. publicStringgetName(){
  24. returnname;
  25. }
  26. publicvoidsetName(Stringname){
  27. this.name=name;
  28. }
  29. }

CacheConcurrencyStrategy有几种,大家自己查下相关资料,按需要配置就可以了,我这里不需要事务支持.
需要注意的是,@Cache这个注解在很多jar包里都有,注意我上边写的import.

2.配置EJB/META-INF/persistence.xml
Xml代码
收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!--Persistencedeploymentdescriptorfordevprofile-->
  3. <persistencexmlns="http://java.sun.com/xml/ns/persistence"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
  6. version="1.0">
  7. <persistence-unitname="cachedb">
  8. <jta-data-source>java:/cachedb</jta-data-source>
  9. <properties>
  10. <propertyname="hibernate.hbm2ddl.auto"value="update"/>
  11. <propertyname="hibernate.show_sql"value="true"/>
  12. <propertyname="hibernate.format_sql"value="true"/>
  13. <propertyname="hibernate.cache.use_second_level_cache"value="true"/>
  14. <propertyname="hibernate.cache.use_structured_entries"value="true"/>
  15. <propertyname="hibernate.cache.use_query_cache"value="true"/>
  16. <propertyname="hibernate.cache.provider_class"value="com.googlecode.hibernate.memcached.MemcachedCacheProvider"/>
  17. <propertyname="hibernate.memcached.servers"value="localhost:11211"/>
  18. <propertyname="hibernate.memcached.cacheTimeSeconds"value="300"/>
  19. </properties>
  20. </persistence-unit>
  21. </persistence>

这里我使用了memcached,还有Ehcache、OSchache、或者TreeCache等,主要需配置:
hibernate.cache.use_second_level_cache = true
hibernate.cache.use_query_cache = true
与相应的hibernate.cache.provider_class

3.在程序中使用查询缓存
首先大家需要明确JPA对缓存的规范还没有形成,但JPA实现的厂家都会用hibernate来做JPA的实现,所以通常的方法是将JPA的Query转换成Hibernate的Query,大家用过Hibernate都知道,Hibernate里的Query有个setCacheable(true/false)的方法,这里是设置查询是否进入二级缓存的.
这里需要强调一下,默认的如果不在程序中显示的执行查询缓存声明操作,hibernate是不会对查询的list进行缓存的,默认的在开启hibernate二级缓存时,hibernate只缓存,根据主键id查找的对象,jpa下是find(id, clazz)方法.

下边是转换的代码:为了区分JPA的Query与Hibernate的Query,我写上了全名
Java代码
收藏代码
  1. publicList<User>listUser(){
  2. javax.persistence.Queryquery=em.createQuery("fromUseruwhereu.id>:id",User.class);
  3. query.setParameter("id",5);
  4. org.hibernate.ejb.QueryImplhs=null;
  5. org.hibernate.QueryhbQuery=null;
  6. List<User>list=null;
  7. if(queryinstanceoforg.hibernate.ejb.QueryImpl){
  8. hs=(org.hibernate.ejb.QueryImpl)query;
  9. hbQuery=hs.getHibernateQuery();
  10. hbQuery.setCacheable(true);//设置使用二级缓存
  11. list=hbQuery.list();
  12. }else{
  13. list=query.getResultList();
  14. }
  15. returnlist;
  16. }


这里再说一下使用经验,这样的转换不光是对createQuery方法,还能对createNamedQuery,甚至是createNativeQuery,都可以缓存查询结果.

只是一点使用经验,跟大家分享一下:)

你可能感兴趣的:(Hibernate)