与Eclipse Link ORM一起使用时,javax.persistence.cache.retrieveMode和



Query Hints在Eclipse Link 2.3.2/2.6.1中用于从二级缓存获取数据时不起作用已使用提示,

@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.hint是关键,即使我们已经设置了JPA提示。这是我们无法控制的事情
但当我传递Eclipse链接提供的提示时,它开始按预期工作,结果是从Cache而不是从DB中获取的。

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

这意味着当我们使用EclipseLink时,它只会根据我们在Query中看到的键[上图]识别EclipseLink提供的提示。

请建议任何工作来获得JPA提示工作

我使用的环境是

  • Eclispe链路2.3.2/2.6.1
  • Runnin鱼翅服务Glassfish 4.1〔payara〕
  • Java8/JEE7

您所说的正在运行的查询提示(eclipselink.query-results-cache)是完全无关的-它为查询结果创建了一个新的缓存,这样下次执行同一查询时,结果就已经存在了,因此无需再次执行查询。这在二级缓存的外部(高于二级缓存)。

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

您可以使用em.find()或使用ID值的读取查询来检查实体是否已缓存。缓存是按ID索引的,因此它不需要转到数据库来确定您想要的实体。

相关内容

最新更新