JPA本机查询二级缓存

时间:2014-04-14 14:36:45

标签: jpa

我需要使用JPA的本机sql使用二级缓存。 我找不到办法。如果JPA支持本机查询缓存,可以有人建议

2 个答案:

答案 0 :(得分:2)

JPA L2缓存是为实体设计的。如果你还没有获得任何优先权,那么使用JPA是毫无意义的,其次,即使你确实有实体,本机查询也不一定会返回它们,所以没有任何东西可以缓存。

显然,你可能会发现一个实现,它允许在本地(SQL)查询中缓存L2缓存中的信息,但是你没有使用JPA规范标准,而是使用供应商细节(这会停止工作)如果你曾经改变过JPA提供者)

答案 1 :(得分:0)

JPA使用@Cacheable注释支持二级缓存,请参阅here官方文档。二级缓存的配置是特定于持久性提供程序的,这是如何将其设置为休眠的示例。

首先添加与缓存提供程序的集成,在本例中为ehcache:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>SOME-HIBERNATE-VERSION</version>
</dependency>

然后将其添加到会话工厂配置:

<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">/your-cache-config.xml</prop>

然后添加一个ehcache xml配置文件:

<?xml version="1.0" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             updateCheck="false"
       xsi:noNamespaceSchemaLocation="ehcache.xsd" name="yourCacheManager">

     <diskStore path="java.io.tmpdir"/>

     <cache name="yourEntityCache"
            maxEntriesLocalHeap="10000"
            eternal="false"
            overflowToDisk="false"
            timeToLiveSeconds="86400" />

     <cache name="org.hibernate.cache.internal.StandardQueryCache"
            maxElementsInMemory="10000"
            eternal="false
            timeToLiveSeconds="86400"
            overflowToDisk="false"
            memoryStoreEvictionPolicy="LRU" />

  <defaultCache
          maxElementsInMemory="10000"
          eternal="false"
          timeToLiveSeconds="86400"
          overflowToDisk="false"
          memoryStoreEvictionPolicy="LRU" />
</ehcache>

缓存应该可以正常工作,尝试使用@Cache(本机Hibernate注释)或标准@Cacheable JPA注释来注释实体。查询需要单独标记为缓存。

这是缓存命名查询的方法:

@NamedQuery(name="account.queryName",
   query="select acct from Account ...",
   hints={
       @QueryHint(name="org.hibernate.cacheable",
       value="true")
   }     
})

这是缓存条件查询的方法:

List cats = session.createCriteria(Cat.class)
    .setCacheable(true)
    .list();