【问题标题】:JPA 2-level cachingJPA 2 级缓存
【发布时间】:2015-10-18 13:12:37
【问题描述】:

很抱歉提供了一个不太具体的标题。其实我是一团糟。

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

好事:数据通过 JPA 插入/更新到整个应用程序。

目前使用的技术:带有 JPA 2.0 和 hibernate 3.2 的 Spring 3.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>

或者我是否也需要提供

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache-core</artifactId>
  <version>${ehcacheVersion}</version>
</dependency>

我的第三个问题:我需要在我的 persistence.xml 中添加哪些属性。 我确信这两个属性:

<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>

=====感谢您的回答。此更新可能对开发人员有所帮助。====
我放下了启用 EHcache 需要定义的属性,因为很多人都面临这个异常

Caused by: org.hibernate.cache.NoCachingEnabledException: Second-level cache is not enabled for usage [hibernate.cache.use_second_level_cache | hibernate.cache.use_query_cache]

因为属性不匹配和依赖不匹配。

以下属性应该适用于 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


【解决方案1】:

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

不,它没有。 JPA 只是一个标准,不提供任何实现。 Hibernate 提供 JPA 的实现(EntityManager、EntityMangerFactory 等)以及它自己的 ORM 实现(Session、Session Factory 等)。因此,您需要 EHCache 来支持二级缓存。但是,您可以使用 JPA 注释/配置进行缓存,但这需要更改 persistence.xml。

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

我的第二个问题:我需要为 Ehcache 提供依赖还是 Hibernate-Ehcache 够用吗?

您需要添加 ehcache-core、hibernate-ehcache 和 slf4j-simple(EHCache 使用 slf4j 进行日志记录)。有关依赖项的详细信息,请查看此link 上的Hibernate EHCache Maven 依赖项部分。

我的第三个问题:我需要在我的 持久性.xml。

如果你使用 JPA 方式,那么 sample 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>

【讨论】:

  • 感谢您的快速回复并提供这么多有用的链接。
  • 但是对于休眠 4.x,应该使用以下属性 而不是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 2015-03-19
  • 1970-01-01
  • 2014-05-28
  • 2017-03-31
相关资源
最近更新 更多