2016-09-09 11 views
4

Позвольте мне понять, что нужно для кеша второго уровня. В базовом классе моего веб-приложения есть запрос. Этот запрос вызывается почти для каждого действия (я использую 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

+0

Где конфигурация ehcache? – sergiu

+0

Добавлен ehcache config – Knu8

+0

http://stackoverflow.com/questions/10600698/how-do-i-use-hibernates-second-level-cache-with-jpa, как эта ссылка может помочь вам в кэше запросов. –

ответ

0

Я думаю, вы должны использовать другой класс область заводскую:

net.sf.ehcache.hibernate.EhCacheRegionFactory

http://www.ehcache.org/documentation/2.7/integrations/hibernate

с другой стороны, если вы используете @Cacheable аннотаций необходимо включить их с помощью @EnableCaching или

<cache:annotation-driven /> 
+0

К сожалению, я использую более старые версии спящего режима и Ehcache. Поэтому некоторые атрибуты, упомянутые в учебнике, не применимы для меня. Я думаю, мне нужно сначала обновить Ehcache и Hibernate, прежде чем попробовать этот учебник. Кроме того, SAX парсер дает ошибку для '<кэш \t имени = "com.somecompany.someproject.domain.Country" \t maxEntriesLocalHeap = "10000" \t вечного = "ложного" \t timeToIdleSeconds = "300" \t timeToLiveSeconds = "600" <стратегия сохранения = "localTempSwap" /> /> ' – Knu8

0

Кэш второго уровня не работает, потому что вы не запрашиваете данные по ID (см. Эту ссылку When and how to use hibernate second level cache?).

В вашем случае вы можете использовать кеш запросов.

 Смежные вопросы

  • Нет связанных вопросов^_^