我的应用程序经常在数据库中查询很少更改的数据。所以我决定使用缓存的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)
我应该做一些额外的设置吗? 任何帮助表示赞赏!
由于提前, 彼得
您是否试图启用第二级实体缓存或查询缓存?这两者非常不同。查询本身必须明确表示他们想要使用查询缓存。 – skaffman 2011-05-22 12:30:37