В заголовке, очевидно, говорится: я не могу заставить работать кэш второго уровня для 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();
Слияние работает - потому что в базу данных есть данные.И поиск работает, потому что я получаю объекты с сгенерированными идентификаторами.
Запрошенные объекты индексируются в базе данных.
WHODUNNIT?