2017-02-13 58 views
0

查询提示在用于从第二个数据获取数据时,在Eclipse Link 2.3.2/2.6.1中不起作用一级缓存 使用提示,当与Eclipse Link ORM一起使用时,javax.persistence.cache.retrieveMode和javax.persistence.cache.retrieveMode不能与NamedQuery一起使用ORM

@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") 

试着用下面的选项。

1. Added JPA Hints to Named query itself 
@NamedQuery(
name = TestEntity.FIND_BY_CODE, 
query = "select t from Test t where t.code = :code", 
hints = { 
@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), 
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") }) 

2. Adding hints to the Entity Manager Itself after injecting it 
em.setProperty("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE); 
em.setProperty("javax.persistence.cache.storeMode", CacheRetrieveMode.USE); 

3. Added JPA hints at the time of Query execution 
em.createNamedQuery(TestEntity.FIND_BY_CODE, 
AlertCategoryType.class).setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.USE) 
.setHint("javax.persistence.cache.storeMode", CacheStoreMode.USE) 
.setParameter("code", code).getSingleResult(); 

以上提示都不起作用。然后我试着调试三个不同的选项,我发现是 设置这些提示后形成的数据库查询是通过提示作为键/值对下面。

eclipselink.query.hints => {javax.persistence.cache.retrieveMode=USE,                              javax.persistence.cache.storeMode=USE} 

哪里eclipselink.query.hints是关键,即使我们设置了JPA提示。这是我们无法控制改变这一点的事情。
但是,当我通过Eclipse Link提供的提示如下,它开始按预期工作,结果从缓存而不是从数据库中获取。

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 

这意味着,当我们使用Eclipse链接它只能识别的Eclipse链接根据键[如上所示]我们在查询看到提供提示。

请提出解决办法,以获得JPA提示工作

环境我使用的是

  • Eclispe的链接2.3.2/2.6.1
  • 飞奔鳍服务Glassfish的4.1 [似鲭水狼牙鱼]
  • Java8/JEE7

回答

1

幽州查询提示工作(eclipselink.query-结果高速缓存)是完全不相关的 - 它会为查询结果创建一个新的缓存,以便下次执行相同的查询时,结果已经存在,因此不需要再次执行查询。这超出了二级缓存的范围。

您引用为不工作的设置会影响二级缓存。没有更多的信息,我要说明他们可能按预期工作。仅仅因为你的查询进入数据库并不意味着缓存没有被使用。缓存实体与将结果缓存到查询非常不同。如果查询结果没有被缓存,除非启用了内存查询,否则大部分全部读取类型的查询都必须到数据库中以确定需要构建和返回哪些实体。然后,EclipseLink将使用这些结果来检查缓存 - 如果实体已经存在,它们将按原样返回 - 这样可以避免从数据重建实体的开销。

您可以通过使用em.find()或读取使用ID值的查询来检查您的实体是否已被缓存。缓存按ID进行索引,所以它不需要去数据库找出你想要的实体。

相关问题