gpt4 book ai didi

hibernate - Hibernate JPA缓存

转载 作者:行者123 更新时间:2023-12-04 13:17:56 26 4
gpt4 key购买 nike

我有一个名为 Master_Info_tbl 的表。它是一个查询表:

这是该表的代码:

 @Entity
@Table(name="MASTER_INFO_T")
public class CodeValue implements java.io.Serializable {
private static final long serialVersionUID = -3732397626260983394L;
private Integer objectid;
private String codetype;
private String code;
private String shortdesc;
private String longdesc;
private Integer dptid;
private Integer sequen;
private Timestamp begindate;
private Timestamp enddate;
private String username;
private Timestamp rowlastchange;
//getter Setter methods

我有一个服务层,该服务层调用方法service.findbycodeType(“Code1”);同样查询此表以查找其他代码类型,例如code2,code3等,直到code10从同一张表中获取结果集,并显示在jsp页面的下拉列表中,因为这些下拉列表占90%的页面,我想将它们全局缓存。任何想法如何实现这一目标?仅供引用:我在Struts2和Spring中使用JPA和Hibernate。使用的数据库是DB2 UDB8.2

@帕斯卡
非常感谢您的所有答复。它给了我很大的帮助。我实现了我应该实现的一切(我认为)。我仍然不知道二级缓存是否正常工作。由于我无法从缓存中看到log4j日志文件中的日志,因此控制台中也没有任何显示。为了证明二级缓存的实现正在工作中,我需要某种证明并将其展示给我的经理,所以我有些困惑。请帮忙!我知道我已经很接近完成它了,只是.....这是我的代码(如果您认为缺少某些内容或不应存在的内容,请告诉我):实体类
@Entity
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "CODEVALUE_T")
public class CodeValue implements java.io.Serializable {
//all the field name with getter and setter
}

Persistence.xml:
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" />
</properties>

服务层DAO:
try {
System.out.println("Calling the findByCodetype() method");
final String queryString = "select model from CodeValue model where model.codetype"
+ "= :propertyValue" + " order by model.code";

Query query = em.createQuery(queryString);
query.setHint("org.hibernate.cacheable", true);
query.setParameter("propertyValue", propertyName);
return query.getResultList();

} catch (RuntimeException re) {
logger.error("findByCodetype failed: ", re);
throw re;
}

Log4j.property值以显示详细信息log4j.category.org.hibernate.cache = DEBUG
ehcache.xml代码(它的位置在我的struts.xml文件所在的src/文件夹中)
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="6000"
timeToLiveSeconds="12000"
overflowToDisk="true"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>

</ehcache>

最佳答案

(...) since these drop downs are in 90% of the pages I am thinking to cache them globally.



对于这种用例,使用 query cache非常合适。因此,激活 second-level cache,缓存 CodeValue实体(请参阅 2.2.8. Caching entities),然后将查询放在 query cache中的 findbycodeType后面。为此,请使用:
javax.persistence.Query query = manager.createQuery(...);
query.setHint("org.hibernate.cacheable", true);

为了明确起见,将查询和作为该查询的参数提供的值的组合用作键,并且该值是该查询的标识符列表。
用示意图表示,类似这样的东西:

* ------------------------------------------------- ------------------------- *
|查询缓存|
| ------------------------------------------------- ------------------------- |
| [“来自CodeValue c,其中c.codetype =?”,[“Code1”]]-> [1,2,...] |
| [“来自CodeValue c,其中c.codetype =?”,[“Code2”]]-> [3,5,6,...] |
* ------------------------------------------------- ------------------------- *

因此,使用不同的参数调用您的方法将不会“刷新先前的数据”,该参数是键的一部分(否则查询缓存将无法工作)。

请注意,这是特定于Hibernate的,JPA 1.0并未指定二级缓存和查询缓存。

也可以看看
  • Hibernate: Truly Understanding the Second-Level and Query Caches
  • 关于hibernate - Hibernate JPA缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2877390/

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