【发布时间】:2011-09-11 01:31:13
【问题描述】:
标题很明显:我不能让二级缓存为 JPA2/Hibernate 3.6.3 工作。
我一直在尝试许多技巧以使其正常工作。但我只是成功地让查询缓存工作。尽管 Hibernate 创建了缓存(实例的名称),但它们被忽略了。即使错过了也不会被登记。可能是版本不兼容。我尝试了其他一些没有结果。而且我不再愿意尝试所有排列。 :-P
我在这里问这个问题,因为有些人似乎可以正常工作(我也尝试过他们的例子)。也许他们能发现我犯的明显错误。
提前感谢任何帮助我的人! :-)
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_2_0.xsd"
version="2.0">
<persistence-unit name="foo" transaction-type="RESOURCE_LOCAL">
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:derby:/opt/db/foo;create=true"/>
<property name="javax.persistence.jdbc.user" value="foo"/>
<property name="javax.persistence.jdbc.password" value="bar"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
</properties>
</persistence-unit>
pom.xml
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.0-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.4.2</version>
JMX 设置
这样我可以检查缓存的使用情况。创建缓存(每个实体一个),并且两个查询缓存也在那里。后者的填充速度非常快。但是没有一个缓存显示任何未命中或命中。甚至查询缓存都没有。
ManagementService.registerMBeans( CacheManager.getInstance(), ManagementFactory.getPlatformMBeanServer(), true, true, true, true, true )
实体缓存被忽略。它们至少应包含保存到数据库中的实体。或通过查询检索。那里什么都没有。
Java 代码示例
EntityManager entityManager = Persistence.createEntityManagerFactory("foo").createEntityManager();
entityManager.getTransaction.begin();
entityManager.merge(bar);
entityManager.getTransaction.commit();
Query query = entityManager.createQuery("select b from Bar p where b.name = :name");
query.setParameter("name", "fooBar");
query.setHint("org.hibernate.cacheable","true");
query.getSingleResult();
合并有效 - 因为数据库中有数据。并且查找有效,因为我正在获取具有生成 id 的对象。
查询的实体在数据库中被索引。
谁知道?
【问题讨论】:
-
您是否将实体标记为@Cacheable?
-
是的。并在 JMX 中弹出正确的缓存。只有实体在查询时不会被缓存。不是在持久化/合并时。
标签: hibernate jpa-2.0 ehcache second-level-cache