Hibernate Second-level-query-caching-Problem mit der gleichen where-Klausel

Meine Anwendung verwendet JPA (1.2), Frühling (3.1.2), Spring Data (1.1.0) und im Ruhezustand (4.1.7).
Datenbank : Oracle10g

Wir haben aktivieren second-level-caching. Es funktioniert gut mit Einheit, sondern es ist die Schaffung Probleme auf named query-caching.

Das Problem ist: Wenn die benannte Abfrage, die hat die gleiche where-Klausel, aber unterschiedliche select-Anweisung, dann, was die erste Abfrage ausführen, gibt es das gleiche Ergebnis für die zweite Abfrage auch.

Wie meine erste Abfrage(countRelease) ist

select count(r) from Release r where r.type in 
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart

und zweite Abfrage(findRelease)ist

select r from Release r where r.type in 
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)   
order by r.validityStart

Wenn die erste Abfrage wird zuerst ausgeführt, dann zählt kommen wird, und danach, wenn ich die zweite Abfrage dann auch zählen wird kommen, es sollte geben Sie mir die Liste der release-Einheit.

Wenn ich entfernen, die Abfrage-cache funktioniert es gut und wenn ich einige änderungen, die in der zweiten Abfrage die where-Klausel dann auch es funktioniert gut, aber ich keine Notwendigkeit, das zu tun.

Wie können wir dieses Problem lösen?

Mein Java-code

@Query(name="findRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public List<Release> findRelease();

@Query(name="countRelease")
@QueryHints({@QueryHint(name = "org.hibernate.cacheRegion", value ="cvodrelease"),@QueryHint(name = "org.hibernate.cacheable", value ="true") })
public Long  countOfRelease(Date today);

Cache-Konfiguration

<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" /> 
<property name="hibernate.cache.provider_configuration_file_resource_path" value="ehcache.xml" />

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"  p:cacheManager-ref="ehcache"/>

<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="ehcache.xml"  p:shared="true"/> 
  • Kennt einer die Lösung für das oben genannte Problem
  • Hat jemand eine Lösung für das oben genannte Problem... oder seine Fehler
  • Die QueryKey Klasse scheint Speicher den query-string, so ist dies in der Tat merkwürdig. Ich würde setzen Sie einen Haltepunkt auf QueryKey.generateQueryKey() und versuchen, auf die Spur, warum die queryString argument ist das gleiche für die zwei unterschiedlichen Abfragen.
  • Jain, Es ist besser für Sie post java-code für die überprüfung. code sagt alles. als ich weiß. second-level-cache wirkt sich nicht auf die Abfrage führen. es ist anderes problem.
  • Es ist nicht java-code als solche hat Sie nur Methode-Namen mit der @namedQuery, weil wir mithilfe von JPA-Repository
  • Es ist java-code, der verwendet die benannten Abfragen...
  • Vielleicht ist dies offensichtlich, aber sind Sie sicher, dass Ihre Fragen eindeutige Namen haben? Werden Sie sich bewusst, dass Sie zwei Abfragen mit demselben Namen, in verschiedenen in verschiedenen Klassen definiert werden, werden behandelt, als die gleiche Abfrage.
  • Ja meine Abfrage hat verschiedene Namen. Ich bin mir 100% sicher

InformationsquelleAutor Ranu Jain | 2013-02-18
Schreibe einen Kommentar