2011-05-22 60 views
2

我的應用程序經常在數據庫中查詢很少更改的數據。所以我決定使用緩存的EJB實體來優化它作爲desribed: http://docs.jboss.org/ejb3/docs/tutorial/1.0.7/html/Caching_EJB3_Entities.html使用JBoss Hibernate緩存緩存EJB實體(JBoss-5.0.0.GA)

然而,當我看看休眠SQL日誌(hibernate.show_sql =真)我仍然可以看到相同數量的查詢擊球數據庫沒有配置緩存。這裏是我的persistence.xml文件:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
     version="1.0"> 


     <persistence-unit name="myds"> 
     <jta-data-source>java:/myds</jta-data-source> 

     (...) classes definitions 
     <class>com.my.class.MyEntityOne</class> 
     (...) 

     <properties> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.format_sql" value="false" /> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/> 
      <property name="hibernate.transaction.factory_class" value="org.hibernate.ejb.transaction.JoinableCMTTransactionFactory"/> 


      <!-- 2nd level cache -->          
      <property name="hibernate.cache.use_second_level_cache" value="true"/> 
      <property name="hibernate.cache.use_query_cache" value="true"/> 
      <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/> 
      <property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/> 
      <property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/> 
      <property name="hibernate.cache.region.jbc2.cfg.query" value="local-query"/> 
     </properties> 
     </persistence-unit> 

我所有的JPA實體標註有:

@Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL) 

也許一個小提示會,當我關閉服務器以下異常可以在日誌中可見:

org.hibernate.cache.CacheException:java.lang.IllegalStateException:不在STARTED狀態的緩存電子! 在org.hibernate.cache.jbc2.BasicRegionAdapter.destroy(BasicRegionAdapter.java:243) 在org.hibernate.impl.SessionFactoryImpl.close(SessionFactoryImpl.java:813) 在org.hibernate.ejb.EntityManagerFactoryImpl.close( EntityManagerFactoryImpl.java:46) 在org.jboss.jpa.deployment.ManagedEntityManagerFactory.destroy(ManagedEntityManagerFactory.java:93) 在org.jboss.jpa.deployment.PersistenceUnitDeployment.stop(PersistenceUnitDeployment.java:343) 在陽光下。 reflect.NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.la ng.reflect.Method.invoke(Method.java:597)

我應該做一些額外的設置嗎? 任何幫助表示讚賞!

由於提前, 彼得

+3

您是否試圖啓用第二級實體緩存或查詢緩存?這兩者非常不同。查詢本身必須明確表示他們想要使用查詢緩存。 – skaffman 2011-05-22 12:30:37

回答

1

緩存查詢(如skaffman建議):

Query query = manager.createQuery("SELECT i FROM ...."); 
query.setHint("org.hibernate.cacheable", true); 

在實體時,我注意到,它沒有足夠的註釋與@Cache所有實體。如果實體有參考其他實體(與@Cache註解),您還必須包括一個參考場的頂這個註解:

@Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL) 
@Entity 
public class EntityA { 
    @Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL) 
    private Set<EntityB> entitiesB; 
} 

@Cache (usage=CacheConcurrencyStrategy.TRANSACTIONAL) 
@Entity 
public class EntityB { 
} 

我不知道,如果是一般的規則,但對我來說,在我添加了這些註釋之後,一切都開始按預期工作。