欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jpa hibernate 下配置ehcache

程序员文章站 2022-07-14 11:52:29
...

源:http://www.iteye.com/problems/7842

http://dxp4598.iteye.com/blog/1250512

评:

spring + jpa(hibernate实现)配置Ehcache,如何获取ehcache统计信息

Xml代码  jpa hibernate 下配置ehcache
            
    
    博客分类: EHcache  
  1. <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">  
  2.         <property name="dataSource" ref="dbcpDataSource">  
  3.         <property name="jpaVendorAdapter">  
  4.             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">  
  5.                 <property name="database" value="MYSQL">  
  6.                 <property name="showSql" value="true">  
  7.             </bean>  
  8.         </property>  
  9.         <property name="jpaProperties">  
  10.             <props>  
  11.                 <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>  
  12.                 <prop key="hibernate.cache.use_query_cache">true</prop>  
  13.                 <prop key="hibernate.cache.use_second_level_cache">true</prop>  
  14.                 <prop key="hibernate.generate_statistics">true</prop>  
  15.                 <prop key="hibernate.use_sql_comments">true</prop>  
  16.                 <prop key="hibernate.format_sql">true</prop>  
  17.                 <prop key="hibernate.generate_statistics">true</prop>  
  18.             </props>  
  19.         </property>  
  20.     </bean>  


Entity上面也加了Cache注释,ehcache.xml也配置好了,但是jpa如何获得ehcache的一些统计信息呢?

缓存应该是生效了,查询很多次只生成一条SQL语句,像Hibernate里面SessionFactory里面有个statistics()函数 可以打印ehcache统计信息的,不知道JPA里面怎么样打印ehcache的统计信息,比如缓存命中情况等,要不然光配置好了,不能查看统计情况也没 有意义啊

 

已经搞定了:-)

Session session = (Session)baseDAO.getEntityManager().getDelegate();
SessionFactory sessionFactory = session.getSessionFactory();

这样就可以获得SessionFactory了,然后就可以调用里面的getStatistics()获得统计信息了,现在结贴。

 

 

在Hibernate3 JPA里配置了一下非分布式环境的二级缓存,效果不错。具体过程如下:

 

1, 需要引入的jar包

 

      http://ehcache.org/downloads/catalog 下载的包里已经包含了简单的例子和javadoc

 

      ehcache-core-2.4.6.jar (必需)

      ehcache-terracotta-2.4.6.jar (必需)

      slf4j-api-1.6.1.jar

      slf4j-jdk14-1.6.1.jar

 

 

2, 在JPA的persistence.xml中加入以下配置

 

 

      <property name="hibernate.cache.provider_class" 

                value="org.hibernate.cache.SingletonEhCacheProvider" />
     <property name="hibernate.cache.provider_configuration" value="/ehcache.xml" />
     <property name="hibernate.cache.use_second_level_cache" value="true" />
     <property name="hibernate.cache.use_query_cache" value="true" />

 

 

3, 对ehcache进行简单的设置(ehcache.xml

 

      <?xml version="1.0" encoding="UTF-8"?>
      <ehcache>
      <defaultCache maxElementsInMemory="1000" eternal="false"
           timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"
           clearOnFlush="true">
      </defaultCache>

       <!-- 单独对某个entity的缓存策略设置-->
      <cache name="com.payment.entity.PromotionEntity" maxElementsInMemory="100"

           eternal="false"
           timeToIdleSeconds="1200" timeToLiveSeconds="1200" overflowToDisk="false"
           clearOnFlush="true">
      </cache>
     </ehcache>

 

 

4, JPA的Entity类中声明缓存的隔离机制

 

 

       import org.hibernate.annotations.Cache;
       import org.hibernate.annotations.CacheConcurrencyStrategy;

 

      @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
      @Entity
      @Table(name = "catagory")
      public class CatagoryEntity extends BaseEntity { ... }

 

 

5, 如何使用二级缓存中的对象

 

 

       在Hibernate中可以通过org.hibernate.Query.setCacheable(true);

       在JPA中,由于EntityManager中得到的javax.persistence.Query没有这个方法了。我们可以通过

       javax.persistence.Query.setHint(”org.hibernate.cacheable”, true);来实现读取二级缓存。

 

 

 

6, 在log4j输出日志中可以看到缓存机制作用

log4j.logger.org.hibernate.cache=debug