Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
HibernateJPA缓存_Hibernate_Jpa_Caching - Fatal编程技术网

HibernateJPA缓存

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

我有一个名为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 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.