Позвольте мне понять, что нужно для кеша второго уровня. В базовом классе моего веб-приложения есть запрос. Этот запрос вызывается почти для каждого действия (я использую Struts, и это то, как приложение разрабатывается, поэтому не может с ним портиться), например, загрузка моей домашней страницы вызывает три отдельных действия Struts, и этот запрос выполняется для каждого действия. Запрос в QueryDsl форме выглядит как Iterable<Event> eventsFromDb2 = eventRepository.findAll(EventExpressions.queryAllEvents());
и в упрощенном виде это выглядит Select e from Event e where e.deleted = false
Кэш второго уровня не работает в Hibernate + Spring + JPA и EhCache
Этот запрос принимает его собственные сладкое время ~ 10сек, так что делает приложение очень медленно, так как его называют все действия (CRUD) полотна заявление. По моему мнению, при включении кеша второго уровня, hibernate + Spring orm должен извлекать результат из кеша и избегать запроса базы данных. Однако он не работает. Persistence.xml выглядит следующим образом
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" depends-on="flyway">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="de.mm.moreevent.type" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />
<property name="generateDdl" value="true" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.cache.use_query_cache" value="true" />
<entry key="hibernate.cache.use_second_level_cache" value="true" />
<entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
<entry key="hibernate.cache.default_cache_concurrency_strategy" value="read-write" />
<entry key="javax.persistence.sharedCache.mode" value="ALL" />
<entry key="hibernate.generate_statistics" value="false" />
</map>
</property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- see: http://springcert.sourceforge.net/2.5/4-study-transaction-management.html -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="makeBooking" read-only="false" propagation="NESTED" rollback-for="de.mm.moreevent.exception.ManagerException" />
<tx:method name="sendConfirmationAndInvoice" read-only="true" propagation="NESTED" rollback-for="de.mm.moreevent.exception.ManagerException" />
<tx:method name="sendConfirmationOnly" read-only="true" propagation="NESTED" rollback-for="de.mm.moreevent.exception.ManagerException" />
<tx:method name="saveOrUpdate" read-only="false" propagation="NESTED" rollback-for="de.mm.moreevent.exception.ManagerException" />
<tx:method name="participantsImport" read-only="false" propagation="NESTED" rollback-for="de.mm.moreevent.exception.ManagerException" />
</tx:attributes>
</tx:advice>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<qualifier value="transactionManager" />
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <!-- class="org.springframework.jdbc.datasource.DriverManagerDataSource" -->
<property name="driverClass">
<value>org.postgresql.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:postgresql://127.0.0.1:port/dbName</value>
</property>
<property name="user">
<value>user1</value>
</property>
<property name="password">
<value>******</value>
</property>
<property name="initialPoolSize" value="5" />
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="30" />
<property name="idleConnectionTestPeriod" value="200" />
<property name="acquireIncrement" value="1" />
<property name="maxStatements" value="0" />
<property name="numHelperThreads" value="3" />
</bean>
<!-- see: http://flywaydb.org/documentation/api.html -->
<bean id="flyway" class="com.googlecode.flyway.core.Flyway" init-method="migrate">
<property name="dataSource" ref="dataSource" />
<property name="table" value="schema_version"></property>
<property name="locations" value="customer/db-scripts/migration"/>
</bean>
<bean id="bouncyCastleProviderInitialisation" class="de.mm.moreevent.util.BouncyCastleProviderInitialisation" init-method="init" />
<bean id="strongEncryptorBC" class="org.jasypt.encryption.pbe.PooledPBEStringEncryptor">
<property name="providerName">
<value>BC</value>
</property>
<property name="algorithm">
<value>algo</value>
</property>
<property name="password">
<value>******</value>
</property>
<property name="poolSize">
<value>4</value>
</property>
</bean>
<bean id="hibernateStringEncryptor" class="org.jasypt.hibernate4.encryptor.HibernatePBEStringEncryptor">
<property name="registeredName">
<value>strongHibernateStringEncryptor</value>
</property>
<property name="encryptor">
<ref bean="strongEncryptorBC" />
</property>
</bean>
Ниже Ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
name="cacheManager"
updateCheck="false"
maxBytesLocalHeap="100M"
statistics="true">
<!--
| Please see http://ehcache.sourceforge.net/documentation /configuration.html for
| detailed information on how to configurigure caches in this file
+-->
<!-- Location of persistent caches on disk -->
<diskStore path="java.io.tmpdir/moreEventObjCache" />
<defaultCache eternal="false" maxElementsInMemory="100000"
overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="600"
timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" statistics="true"/>
<cache name="bookingTransaktions" eternal="true"
overflowToDisk="false" diskPersistent="false"
timeToIdleSeconds="0" timeToLiveSeconds="0" statistics="true"/>
<cache name="mailingBean" eternal="true" maxElementsInMemory="10000"
overflowToDisk="false" diskPersistent="false"
/>
Ниже мой Entity класс
import javax.persistence.Cacheable;
...
@Entity
@Table(name = "EVENT")
@Cacheable
@Configurable(dependencyCheck = true)
public class Event extends MoreEventDataBaseEntity implements CloneChangeEventI {
...
Я тестирую дляВремя, затраченное на выполнение запроса, Ниже приведен код (я называю тот же запрос два раза подряд)
timer.mark();
Iterable<Event> eventsFromDb = eventRepository.findAll(EventExpressions.queryAllEvents(), EventExpressions.orderByOnlineStartDate(true));
timer.mark();
Iterable<Event> eventsFromDb2 = eventRepository.findAll(EventExpressions.queryAllEvents(), EventExpressions.orderByOnlineStartDate(true));
eventsFromDb2.getClass();
timer.mark();
Теперь, в результате, этот фрагмент кода вызывается три раза с веб-страницы и после результат в пульт
init Struts page load:
EventManager.java:130: +0ms
// Query fired first time, it took 8 seconds as expected
EventManager.java:132: +8103ms
// Query fired second time, it took 15 ms due to so caching
EventManager.java:135: +15ms
init (Ajax1):
EventManager.java:130: +0ms
// Query fired and it took 9.5 sec, However I am expecting it to be few milliseconds ???? second level cache not working I suppose ????
EventManager.java:132: +9501ms
EventManager.java:135: +21ms
Before timer 2016-09-09T14:21:41.853+02:00
init (Ajax2):
EventManager.java:130: +1ms
???? took 9.5 seconds again. second level cache not working I suppose same as Ajax1????
EventManager.java:132: +9506ms
EventManager.java:135: +22ms
То же самое происходит во всем приложении. Кэш второго уровня вообще не работает. Это будет очень полезно для меня, если я смогу сохранить это время выполнения запроса путем кэширования. Я использую Spring ORM 3.2.1, Hibernate Ehcache 4.1.9
Где конфигурация ehcache? – sergiu
Добавлен ehcache config – Knu8
http://stackoverflow.com/questions/10600698/how-do-i-use-hibernates-second-level-cache-with-jpa, как эта ссылка может помочь вам в кэше запросов. –