gpt4 book ai didi

hibernate - WildFly 中的 JPA 共享缓存/二级缓存

转载 作者:行者123 更新时间:2023-12-03 02:47:37 25 4
gpt4 key购买 nike

我使用的是 WildFly 8.1、JPA 2.1 和 Hibernate 4.3.5

我想在WildFly中使用JPA共享缓存/二级缓存

我遵循 WildFly 文档:https://docs.jboss.org/author/display/WFLY8/JPA+Reference+Guide#JPAReferenceGuide-UsingtheInfinispansecondlevelcache

这是我的persitience.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myAppPU" transaction-type="JTA">
<jta-data-source>java:/jdbc/myAppDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="org.hibernate.flushMode" value="MANUAL"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
</properties>
</persistence-unit>
</persistence>

我将属性 hibernate.cache.use_second_level_cache 设置为 true并将共享缓存模式设置为ENABLE_SELECTIVE

我想要缓存的实体(@Entity)用@Cacheable(true)注释,如下所示:

@Entity
@Cacheable(true)
public class Tooltip implements Serializable {
@Id
private String path ;
private String description ;
private Boolean rendered ;
//...
}

但是每次我访问网页时, hibernate 都会生成大量选择来获取我指示为 @Cacheable(true) 的所有实体,即使我已经访问了该页面(在同一 session 中)。

看来共享缓存/二级缓存不起作用

我错过了什么吗?

<小时/>

谢谢你,赫韦尔曼

我尝试在 persistence.xml 中将 hibernate.cache.use_query_cache 设置为 true

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="myAppPU" transaction-type="JTA">
<jta-data-source>java:/jdbc/myAppDS</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true" />
<property name="org.hibernate.flushMode" value="MANUAL"/>
</properties>
</persistence-unit>
</persistence>

以及我正在使用的查询中的提示

@Entity
@NamedQueries({
@NamedQuery(name = "FieldInfos.findAll", query = "SELECT i FROM FieldInfos i", hints = {@QueryHint(name="org.hibernate.cacheable",value="true")}),
@NamedQuery(name = "FieldInfos.findByPath", query = "SELECT i FROM FieldInfos i WHERE i.path = :path", hints = {@QueryHint(name="org.hibernate.cacheable",value="true")})
})
@Cacheable(true)
public class FieldInfos implements Serializable {
//...
}

但问题依然存在

我也尝试使用新版本的 WildFly:8.2 和 Hibernate 4.3.7,但问题仍然存在

最佳答案

二级缓存仅影响直接实体查找,对应于EntityManager.find()

如果您试图避免影响缓存实体的各种 SELECT 查询,您还需要启用查询缓存:

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

并且您需要为要缓存的每个查询设置查询提示org.hibernate.cacheable=true

关于hibernate - WildFly 中的 JPA 共享缓存/二级缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28065897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com