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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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
Jpa javax.persistence.cache.retrieveMode和javax.persistence.cache.retrieveMode在与Eclipse链接ORM一起使用时不与NamedQuery一起使用_Jpa_Eclipselink_Glassfish 4_Second Level Cache - Fatal编程技术网

Jpa javax.persistence.cache.retrieveMode和javax.persistence.cache.retrieveMode在与Eclipse链接ORM一起使用时不与NamedQuery一起使用

Jpa javax.persistence.cache.retrieveMode和javax.persistence.cache.retrieveMode在与Eclipse链接ORM一起使用时不与NamedQuery一起使用,jpa,eclipselink,glassfish-4,second-level-cache,Jpa,Eclipselink,Glassfish 4,Second Level Cache,当用于从二级缓存获取数据时,查询提示在Eclipse链接2.3.2/2.6.1中不起作用 使用提示 @QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"), @QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE") eclipselink.query.hints => {eclipselink.query-resul

当用于从二级缓存获取数据时,查询提示在Eclipse链接2.3.2/2.6.1中不起作用 使用提示

@QueryHint(name = "javax.persistence.cache.retrieveMode", value = "USE"),
@QueryHint(name = "javax.persistence.cache.storeMode ", value = "USE")
eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
尝试以下选项

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 => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
上述提示的用法都不起作用。然后我试着在三个不同的选项上调试我发现, 设置这些提示后形成的数据库查询将作为下面的键/值对传递提示

eclipselink.query.hints => {javax.persistence.cache.retrieveMode=USE,                                                                                                                      javax.persistence.cache.storeMode=USE} 
eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
其中eclipselink.query.hints是关键,即使我们已经设置了JPA提示。这是我们无法控制的,无法改变这一点。
但当我传递Eclipse链接提供的如下提示时,它开始按预期工作,结果是从缓存而不是从数据库中获取的

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
这意味着当我们使用EclipseLink时,它只能根据我们在查询中看到的键[上图]识别EclipseLink提供的提示

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
请建议任何使JPA提示生效的方法

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
我使用的环境是

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
  • Eclispe链接2.3.2/2.6.1
  • Runnin fin serve Glassfish 4.1[帕亚拉]
  • Java8/JEE7

您声明的查询提示正在工作(eclipselink.query results cache)是完全不相关的-它会为查询结果创建一个新的缓存,以便下次执行同一查询时,结果已经存在,因此无需再次执行查询。这在第二级缓存之外(在超越缓存之上)

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
被称为不工作的设置会影响二级缓存。如果没有更多的信息,我将声明他们很可能按照预期工作。查询转到数据库并不意味着缓存没有被使用。缓存实体与将结果缓存到查询非常不同。如果未缓存查询结果,除非已启用内存内查询,否则大多数“全部读取”类型查询必须转到数据库,以确定需要构建和返回哪些实体。EclipseLink随后将使用这些结果检查缓存-如果实体已经存在,则按原样返回-这避免了从数据重建实体的开销

eclipselink.query.hints => {eclipselink.query-results-cache.size=500, eclipselink.query-results-cache=true} 
您可以使用em.find()或使用ID值的读取查询来检查实体是否已缓存。缓存是按ID索引的,因此它不需要转到数据库来确定需要哪些实体

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