HibernateJPA缓存
我有一个名为Master\u Info\u tbl的表。它是一个查找表: 以下是表格的代码:HibernateJPA缓存,hibernate,jpa,caching,Hibernate,Jpa,Caching,我有一个名为Master\u Info\u tbl的表。它是一个查找表: 以下是表格的代码: @Entity @Table(name="MASTER_INFO_T") public class CodeValue implements java.io.Serializable { private static final long serialVersionUID = -3732397626260983394L; private Integer objectid; private S
@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%的页面中全局缓存
你知道如何实现这一点吗?
供参考:我正在使用JPA和Hibernate以及Struts2和Spring。正在使用的数据库是DB2UDB8.2
@帕斯卡
非常感谢您的回复。这对我帮助很大,我实现了我想实现的一切。我仍然不知道二级缓存是否工作。因为我无法从缓存中看到log4j日志文件中的任何日志,而且控制台中也没有显示任何内容。为了证明二级缓存的实现是有效的,我需要一些证据,并且需要向我的经理展示。所以我有点被卡住了
请帮忙
我知道我很快就要完成了,但是
这是我的代码(如果您认为缺少什么或不应该有什么,请务必告诉我):
实体类 Persistence.xml:
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true" />
Log4j.property值,以显示详细的Log4j.category.org.hibernate.cache=DEBUG
xml代码(它的位置在src/文件夹中,与我的struts.xml文件所在的位置相同)
看看这项功能
您还可以使用一些轻量级的独立缓存解决方案,如。它可以让您完全控制缓存的内容、时间和方式,但您还需要考虑何时刷新缓存
(…)因为这些下拉列表在90%的页面中,所以我想全局缓存它们
使用将非常适合此用例。因此,激活,缓存CodeValue
实体(请参阅),并将查询放在中的findbycodeType
后面。为此,请使用:
javax.persistence.Query query = manager.createQuery(...);
query.setHint("org.hibernate.cacheable", true);
为了澄清,查询和作为该查询的参数提供的值的组合被用作键,该值是该查询的标识符列表。
示意图上是这样的:
*--------------------------------------------------------------------------*
| Query Cache |
|--------------------------------------------------------------------------|
| [ "from CodeValue c where c.codetype=?", ["Code1"] ] -> [ 1, 2, ... ] |
| [ "from CodeValue c where c.codetype=?", ["Code2"] ] -> [ 3, 5, 6, ... ] |
*--------------------------------------------------------------------------*
*--------------------------------------------------------------------------*
|查询缓存|
|--------------------------------------------------------------------------|
|[“来自CodeValue c,其中c.codetype=?”,[“Code1”]->[1,2,…]|
|[“来自CodeValue c,其中c.codetype=?”,[“Code2”]->[3,5,6,…]|
*--------------------------------------------------------------------------*
因此,使用不同的参数调用方法不会“刷新以前的数据”,参数是键的一部分(或者查询缓存无法工作)
注意,这是特定于Hibernate的,JPA1.0没有指定二级缓存和查询缓存
另见
defaultCache
元素上使用statistics=“true”
,以包含有关此的信息
Hibernate悲哀地将sql语句记录到控制台,即使命中来自缓存
Hibernate悲哀地将sql语句记录到控制台,即使命中来自缓存 错误,如果已使用缓存,Hibernate不会记录sql语句,请使用以下配置进行确认: persistence.xml:
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true" />
日志记录:
Enabled org.hibernate.SQL category.
我检查了您提供的链接,但它对我没有帮助,因为我使用的是相同的方法,下次我再次使用不同的参数调用相同的方法(code1、code2、code3等)因此,前面的数据将自动刷新,因为它只是使用不同的参数进行相同的查询。我得到了另一个解决方案,如下所示:if(queryinstanceof org.hibernate.ejb.QueryImpl){logger.info(“是的,该查询是针对实例org.hibernate.ejb.QueryImpl的,因此总是将可缓存设置为true”)((org.hibernate.ejb.QueryImpl)query.getHibernateQuery().setCacheable(true);}您认为它可以工作吗……正如我提到的,我在hibernate中使用jpa,并且由于某种原因,当我试图设置em.setCacheable(true)时这是entitymanger代码:import javax.persistence.EntityManager;@PersistenceContext public void setEntityManager(EntityManager em){This.em=em;}我缺少任何jar文件吗?我得到了另一个解决方案,如下所示:if(query instanceof org.hibernate.ejb.QueryImpl){logger.info(“是的,查询是针对实例org.hibernate.ejb.QueryImpl的,因此需要将可缓存设置为true”);((org.hibernate.ejb.QueryImpl)查询).getHibernateQuery().setCacheable(true);}你认为它可以工作吗…@Pascal非常感谢你的更新。我已经实现了二级缓存。现在我如何知道缓存工作正常。我的意思是我只想确保我标记为可缓存的对象在缓存中的某个地方?@Sameer配置Hibernate以记录所有二级缓存操作vity.See@Pascal请查看我发布的新答案,如果您对此有任何建议。“Hibernate悲伤地将sql语句记录到控制台,即使命中来自缓存。”不是真的。 *--------------------------------------------------------------------------* | Query Cache | |--------------------------------------------------------------------------| | [ "from CodeValue c where c.codetype=?", ["Code1"] ] -> [ 1, 2, ... ] | | [ "from CodeValue c where c.codetype=?", ["Code2"] ] -> [ 3, 5, 6, ... ] | *--------------------------------------------------------------------------*
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true" />
@NamedQuery(name = "byNameLike", query = "SELECT p FROM Person p WHERE name like ?1",
hints = { @QueryHint(name = "org.hibernate.cacheable", value = "true") })
Enabled org.hibernate.SQL category.