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