JPA общий кэш / кэш второго уровня в WildFly
Я использую WildFly 8.1, поэтому JPA 2.1 и Hibernate 4.3.5
Я хочу использовать общий кэш JPA / кэш второго уровня в WildFly
Я следую документации WildFly: https://docs.jboss.org/author/display/WFLY8/JPA+Reference+Guide
вот мой persitience.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myAppPU" transaction-type="JTA">
<jta-data-source>java:/jdbc/myAppDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="org.hibernate.flushMode" value="MANUAL"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
</properties>
</persistence-unit>
</persistence>
Я устанавливаю для свойства hibernate.cache.use_second_level_cache значение true и для режима shared-cache-mode устанавливается значение ENABLE_SELECTIVE.
А сущности (@Entity), которые я хочу кэшировать, помечаются @Cacheable(true), вот так:
@Entity
@Cacheable(true)
public class Tooltip implements Serializable {
@Id
private String path ;
private String description ;
private Boolean rendered ;
//...
}
Но каждый раз, когда я захожу в спящий режим веб-страницы, генерируется много выбора, чтобы получить все объекты, которые я указал как @Cacheable(true), даже если я уже посещаю страницу (в том же сеансе).
Таким образом, кажется, что общий кэш / кэш второго уровня не работает
Я что-то пропустил?
Спасибо Hwellmann
Я попытался установить hibernate.cache.use_query_cache в true в persitence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myAppPU" transaction-type="JTA">
<jta-data-source>java:/jdbc/myAppDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="org.hibernate.flushMode" value="MANUAL"/>
</properties>
</persistence-unit>
</persistence>
и и подсказка в запросе, который я использую
@Entity
@NamedQueries({
@NamedQuery(name = "FieldInfos.findAll", query = "SELECT i FROM FieldInfos i", hints = {@QueryHint(name="org.hibernate.cacheable",value="true")}),
@NamedQuery(name = "FieldInfos.findByPath", query = "SELECT i FROM FieldInfos i WHERE i.path = :path", hints = {@QueryHint(name="org.hibernate.cacheable",value="true")})
})
@Cacheable(true)
public class FieldInfos implements Serializable {
//...
}
но проблема остается
Я также пытаюсь с новой версией WildFly: 8.2, поэтому Hibernate 4.3.7, но проблема остается слишком
1 ответ
Кэш второго уровня влияет только на прямой поиск объектов, соответствующий EntityManager.find()
,
Если вы пытаетесь избежать всех видов SELECT
Запросы, затрагивающие ваши кэшированные объекты, также необходимо включить кэш запросов:
<property name="hibernate.cache.use_query_cache" value="true" />
и вам нужно установить подсказку запроса org.hibernate.cacheable=true
для каждого запроса, который будет кэширован.