JPA 2级缓存

JPA 2级缓存,jpa,ehcache,Jpa,Ehcache,抱歉,提供了一个不太具体的标题。事实上,我现在一团糟 我的实际问题是:提高应用程序的性能 好消息:数据是通过JPA在整个应用程序中插入/更新的 目前使用的技术:Spring3.2框架,JPA2.0和Hibernate3.2 到目前为止,我们在代码中的任何地方都没有对Hibernate的直接依赖 回到问题上来: 我计划为一些总是获取相同数据(下拉值)的查询实现二级查询缓存 我的第一个问题:JPA是否自己提供二级缓存(不使用EHcache或任何此类依赖) 到目前为止,我发现使用这个属性可以启用二级缓

抱歉,提供了一个不太具体的标题。事实上,我现在一团糟

我的实际问题是:提高应用程序的性能

好消息:数据是通过JPA在整个应用程序中插入/更新的

目前使用的技术:Spring3.2框架,JPA2.0和Hibernate3.2

到目前为止,我们在代码中的任何地方都没有对Hibernate的直接依赖

回到问题上来:

我计划为一些总是获取相同数据(下拉值)的查询实现二级查询缓存

我的第一个问题:JPA是否自己提供二级缓存(不使用EHcache或任何此类依赖)

到目前为止,我发现使用这个属性可以启用二级缓存

query.setHint("org.hibernate.cacheable", true);
我的第二个问题:我是否需要为Ehcache或Hibernate提供依赖项Ehcache就足够了

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-ehcache</artifactId>
 <version>4.0.0</version>
</dependency>
因为属性不匹配和依赖项不匹配

以下属性应适用于hibernate 4.x和Ehcache 2.4.3

<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.cache.provider_configuration_file_resource_path" value="classpath:ehcache.xml" /> 
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>

我的第一个问题:JPA是否自己提供二级缓存(没有 使用EHcache(或任何此类依赖项)

不,没有。JPA只是一个标准,不提供任何实现。Hibernate提供了JPA(EntityManager、EntityRangerFactory等)的实现以及它自己的ORM实现(会话、会话工厂等)。因此,您需要EHCache来支持二级缓存。但是,您可以使用JPA annotations/config进行缓存,但这需要对persistence.xml进行更改

以下两个链接解释了每个配置选项:

  • 使用类/注释进行缓存
  • 使用类/注释进行缓存(带)
我的第二个问题:我需要为Ehcache或提供依赖关系吗 Hibernate缓存足够了吗

<dependency>
 <groupId>org.hibernate</groupId>
 <artifactId>hibernate-ehcache</artifactId>
 <version>4.0.0</version>
</dependency>
您需要添加ehcache核心、hibernate ehcache和slf4j simple(ehcache使用slf4j进行日志记录)。有关依赖项的详细信息,请查看本页的Hibernate EHCache Maven dependencies部分

我的第三个问题:我需要在我的文档中添加哪些属性 persistence.xml

如果您选择JPA方式,那么
persistence.xml
将如下所示:

  <persistence-unit name="FooPu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    ...
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      ...
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.SingletonEhCacheProvider"/>
      <property name="hibernate.cache.use_second_level_cache" value="true"/>
      <property name="hibernate.cache.use_query_cache" value="true"/>
    </properties>
  </persistence-unit>

org.hibernate.ejb.HibernatePersistence
...
启用\u选择性
...

感谢您的快速回复并提供了这么多有用的链接。但是对于hibernate 4.x,应该使用以下属性,而不是感谢您的更新
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.generate_statistics" value="true"/>
<property name="hibernate.cache.provider_configuration_file_resource_path" value="classpath:ehcache.xml" /> 
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory"/>
  <persistence-unit name="FooPu" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    ...
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
      ...
      <property name="hibernate.cache.provider_class" value="org.hibernate.cache.SingletonEhCacheProvider"/>
      <property name="hibernate.cache.use_second_level_cache" value="true"/>
      <property name="hibernate.cache.use_query_cache" value="true"/>
    </properties>
  </persistence-unit>