Spring Data + Hibernate查询缓存不起作用 [英] Spring Data + Hibernate Query Caching not working

查看:152
本文介绍了Spring Data + Hibernate查询缓存不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试但未成功缓存 Spring Data Hibernate environmet中的查询,并使用以下依赖关系

  compile'org.hibernate:hibernate-validator:4.0.0.GA'
compile'org.hibernate:hibernate-entitymanager:3.6。 6.Final'
compile'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
compile'org.hibernate:hibernate-ehcache:3.3.1。 GA'
compile'org.springframework.data:spring-data-jpa:1.2.0.RELEASE'



实体服务的My Spring Data Repository(ServiceRepository)是

  public interface ServiceRepository扩展CrudRepository< Service,Long> ,JpaSpecificationExecutor< Service> {
@Cacheable(merchantServices)
@Query(select s from Service s JOIN s.statusList sas where s.status =?1 and s.priviligedUser.priviligedUserType IN(2,4)and (s.id IN(从Service st inner join st.tags tag where select IN(?3))或s.serviceType IN(?2))中选择st.id,并且sas.active = true和sas.transactorType =?4 ORDER BY s.name)
List< Service> getAllMerchantServicesByStatusTypeAndTags(ServiceStatus状态,List< ServiceType>类型,List< String>标签,TransactorType交易者);

$ / code>



中调用版本库的@Cacheable方法

  public List< Service> getAllServicesByStatusAndId(ServiceStatus status,List< Long> services,TransactorType transactor){
return serviceRepository.getAllMerchantServicesByStatusAndServiceId(status,services,transactor);
}



我的缓存confing(jpa-context.xml)是



它的灵感来源于 spring-data-jpa-examples / src / main / resources / caching-repository-context.xml

 <?xml version =1.0encoding =UTF-8?> 
< beans
xmlns:p =http://www.springframework.org/schema/p
xmlns =http://www.springframework.org/schema/beans
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xmlns:cache =http://www.springframework.org/schema/cache
xmlns:mvc =http://www.springframework.org/schema/mvc
xmlns:context =http://www.springframework.org/schema/contextxmlns:tx = http://www.springframework.org/schema/tx
xsi:schemaLocation =http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/ spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http ://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/ca che
http://www.springframework.org/schema/cache/spring-cache.xsd
default-autowire =byName>

< tx:annotation-driven />

< bean id =cacheManagerclass =org.springframework.cache.support.SimpleCacheManager>
<属性名称=缓存>
< set>
< bean class =org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBeanp:name =merchantServices/>
< / set>
< / property>
< / bean>
< / beans>



启用缓存Hibernate配置(hibernate.cfg.xml)为



 <?xml version ='1.0'encoding ='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC
- // Hibernate / Hibernate配置DTD 3.0 // EN
http://hibernate.sourceforge.net/hibernate-configuration-3.0 .dtd>
< hibernate-configuration>
< session-factory>
< property name =hibernate.default_batch_fetch_size> 16< / property>
< property name =hibernate.max_fetch_depth> 5< / property>

< property name =hibernate.cache.use_query_cache> true< / property>
< property name =hibernate.cache.use_second_level_cache> true< / property>
< property name =hibernate.generate_statistics> true< / property>
< property name =hibernate.cache.provider_class> org.hibernate.cache.EhCacheProvider< / property>
< property name =hibernate.c3p0.timeout> 300< / property>

< / session-factory>
< / hibernate-configuration>

查看日志;每次我请求时,我都会看到执行的查询。

  17:50:28.997 [http-bio-8080-exec-10] INFO org.hibernate.stat.Statistics  -  HQL:从Service s中选择s JOIN s.statusList sas其中s.status =?1和s.priviligedUser.priviligedUserType IN(2,4)和s.id IN(?2)和sas.active = true和sas.transactorType =?3 ORDER BY s.name,time:57ms,rows:1 

下一次我请求时,我看到下面的查询;

  18:03:40.374 [http-bio-8080- exec-8] INFO org.hibernate.stat.Statistics  -  HQL:从服务s中选择s JOIN s.statusList sas其中s.status =?1和s.priviligedUser.priviligedUserType IN(2,4)和s.id IN( ?2)和sas.active = true和sas.transactorType =?3 ORDER BY s.name,time:47ms,rows:1 



参考文献



spring-projects / spring-data-jpa-examples



Spring Data Rest - 缓存



< Spring数据存储库缓存结果

解决方案

jpa-context.xml 中缺少

< cache:annotation-driven /> 解决了这个问题。最后的 jpa-context.xml

 <?xml version =1.0encoding =UTF-8?> 
< beans
xmlns:p =http://www.springframework.org/schema/p
xmlns =http://www.springframework.org/schema/beans
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xmlns:cache =http://www.springframework.org/schema/cache
xmlns:mvc =http://www.springframework.org/schema/mvc
xmlns:context =http://www.springframework.org/schema/contextxmlns:tx = http://www.springframework.org/schema/tx
xsi:schemaLocation =http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/ spring-beans-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http ://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/ca che
http://www.springframework.org/schema/cache/spring-cache.xsd
default-autowire =byName>

< tx:annotation-driven />
< cache:annotation-driven />

< bean id =cacheManagerclass =org.springframework.cache.support.SimpleCacheManager>
<属性名称=缓存>
< set>
< bean class =org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBeanp:name =merchantServices/>
< / set>
< / property>
< / bean>
< / beans>

我还添加了 resources / ehcache.xml

 <?xml version =1.0encoding =UTF-8?> 
< ehcache xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation =http://ehcache.org/ehcache.xsd> ;

< diskStore path =/ home / prayag / cache _/>
< defaultCache
eternal =false
maxElementsInMemory =1000
overflowToDisk =true
diskPersistent =true
timeToLiveSeconds = 300
/>
< / ehcache>

引用为< property name =hibernate.cache.provider_configuration_file_resource_path > ehcache.xml< / property> in resources / hibernate.cfg.xml



我的CPU高速缓冲存储器conf是



  prayag @ prayag:〜/ hacker_ / draobkcalb $ sudo dmidecode -t cache 
[sudo]密码为prayag:
#dmidecode 2.11
SMBIOS 2.5存在。

处理0x000A,DMI类型7,19字节
高速缓存信息
套接字标识:内部高速缓存
配置:启用,未插入,1级
操作模式:回写
位置:内部
安装大小:32 kB
最大大小:32 kB
支持的SRAM类型:
同步
安装的SRAM类型:同步
速度:未知
错误更正类型:未知
系统类型:未知
关联:未知

处理0x000B,DMI类型7,19字节
高速缓存信息
套接字名称:外部高速缓存
配置:启用,未插入,级别2
操作模式:回写
位置:外部
安装大小: 2048 kB
最大容量:2048 kB
支持的SRAM类型:
同步
安装的SRAM类型:同步
速度:未知
错误修正类型:未知
系统类型:未知
相关性:未知


I am trying but not succeeding to cache a query in Spring Data and Hibernate environmet with following dependencies :

compile 'org.hibernate:hibernate-validator:4.0.0.GA'
compile 'org.hibernate:hibernate-entitymanager:3.6.6.Final'
compile 'org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.0.Final'
compile 'org.hibernate:hibernate-ehcache:3.3.1.GA'
compile 'org.springframework.data:spring-data-jpa:1.2.0.RELEASE'

My Spring Data Repository(ServiceRepository) for entity Service is

public interface ServiceRepository extends CrudRepository<Service, Long>, JpaSpecificationExecutor<Service> {
    @Cacheable("merchantServices")
    @Query("select s from Service s JOIN s.statusList sas where s.status=?1 and s.priviligedUser.priviligedUserType IN (2,4) and (s.id IN (select st.id from Service st inner join st.tags tag where tag IN (?3)) or s.serviceType IN (?2)) and sas.active=true and sas.transactorType=?4 ORDER BY s.name")
    List<Service> getAllMerchantServicesByStatusTypeAndTags(ServiceStatus status, List<ServiceType> type, List<String> tags, TransactorType transactor);
}

Repository's @Cacheable method being invoked from

public List<Service> getAllServicesByStatusAndId(ServiceStatus status, List<Long> services, TransactorType transactor) {
    return serviceRepository.getAllMerchantServicesByStatusAndServiceId(status, services, transactor);
}

My Caching confing (jpa-context.xml) is

It is inspired from spring-data-jpa-examples/src/main/resources/caching-repository-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd"
    default-autowire="byName">

    <tx:annotation-driven />

    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
      <property name="caches">
         <set>
          <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="merchantServices"/>
        </set>
      </property>
    </bean>
</beans>

cache enabled Hibernate config (hibernate.cfg.xml) is

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.default_batch_fetch_size">16</property>
        <property name="hibernate.max_fetch_depth">5</property>

        <property name="hibernate.cache.use_query_cache">true</property>
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <property name="hibernate.generate_statistics">true</property>
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> 
        <property name="hibernate.c3p0.timeout">300</property>

    </session-factory>
</hibernate-configuration>

Looking at log; every time I request, I see query executed.

17:50:28.997 [http-bio-8080-exec-10] INFO  org.hibernate.stat.Statistics - HQL: select s from Service s JOIN s.statusList sas where s.status=?1 and s.priviligedUser.priviligedUserType IN (2,4) and s.id IN (?2) and sas.active=true and sas.transactorType=?3 ORDER BY s.name, time: 57ms, rows: 1

Next time I request, I see following query;

18:03:40.374 [http-bio-8080-exec-8] INFO  org.hibernate.stat.Statistics - HQL: select s from Service s JOIN s.statusList sas where s.status=?1 and s.priviligedUser.priviligedUserType IN (2,4) and s.id IN (?2) and sas.active=true and sas.transactorType=?3 ORDER BY s.name, time: 47ms, rows: 1

References

spring-projects/spring-data-jpa-examples

Spring 3.1 Caching and Config

Spring Data Rest - Caching

Spring Data Repository caching results

解决方案

<cache:annotation-driven /> in jpa-context.xml was missing, adding which fixes the problem . The final jpa-context.xml is

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:cache="http://www.springframework.org/schema/cache" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/cache
        http://www.springframework.org/schema/cache/spring-cache.xsd"
    default-autowire="byName">

    <tx:annotation-driven />
    <cache:annotation-driven />

    <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
      <property name="caches">
         <set>
          <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="merchantServices"/>
        </set>
      </property>
    </bean>
</beans>

I also added resources/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">

<diskStore path="/home/prayag/cache_"/>
<defaultCache
        eternal="false"
        maxElementsInMemory="1000"
        overflowToDisk="true"
        diskPersistent="true"
        timeToLiveSeconds="300"
        />
</ehcache>

Which is referenced as <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property> in resources/hibernate.cfg.xml.

My CPU cache conf is

prayag@prayag:~/hacker_/draobkcalb$ sudo dmidecode -t cache
[sudo] password for prayag: 
# dmidecode 2.11
SMBIOS 2.5 present.

Handle 0x000A, DMI type 7, 19 bytes
Cache Information
    Socket Designation: Internal Cache
    Configuration: Enabled, Not Socketed, Level 1
    Operational Mode: Write Back
    Location: Internal
    Installed Size: 32 kB
    Maximum Size: 32 kB
    Supported SRAM Types:
        Synchronous
    Installed SRAM Type: Synchronous
    Speed: Unknown
    Error Correction Type: Unknown
    System Type: Unknown
    Associativity: Unknown

Handle 0x000B, DMI type 7, 19 bytes
Cache Information
    Socket Designation: External Cache
    Configuration: Enabled, Not Socketed, Level 2
    Operational Mode: Write Back
    Location: External
    Installed Size: 2048 kB
    Maximum Size: 2048 kB
    Supported SRAM Types:
        Synchronous
    Installed SRAM Type: Synchronous
    Speed: Unknown
    Error Correction Type: Unknown
    System Type: Unknown
    Associativity: Unknown

这篇关于Spring Data + Hibernate查询缓存不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆