Ứng dụng của tôi sử dụng JPA (1.2), Spring (3.1.2), Spring Data (1.1.0) và Hibernate (4.1.7). DataBase: Oracle10gHibernate Vấn đề bộ nhớ đệm truy vấn cấp hai với cùng một mệnh đề
Chúng tôi đã bật bộ nhớ đệm cấp hai. Nó hoạt động tốt với thực thể nhưng nó tạo ra các vấn đề về bộ nhớ đệm truy vấn được đặt tên.
Vấn đề là: Nếu truy vấn được đặt tên có mệnh đề where where nhưng câu lệnh select khác nhau, thì bất kỳ truy vấn đầu tiên nào thực thi nó cũng cho kết quả tương tự cho truy vấn thứ hai.
Giống như truy vấn đầu tiên của tôi (countRelease) là
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
và thứ hai truy vấn (findRelease) là
select r from Release r where r.type in
(select c.contentTypeId from ContentType c where c.parentContentTypeId is NULL)
order by r.validityStart
Nếu truy vấn đầu tiên được chạy đầu tiên sau đó đếm sẽ đến và sau đó nếu tôi chạy thứ hai truy vấn sau đó cũng tính sẽ đến nó sẽ cho tôi danh sách các thực thể phát hành.
Nếu tôi xóa bộ nhớ truy vấn, nó hoạt động tốt và nếu tôi thực hiện một số thay đổi trong truy vấn thứ hai ở đâu thì điều đó cũng hoạt động tốt nhưng tôi không cần làm điều đó.
Cách chúng tôi có thể giải quyết vấn đề này?
mã Java My
@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);
Cấu hình Cache
<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"/>
Có ai có giải pháp cho vấn đề trên –
Có ai có giải pháp cho vấn đề trên ... hoặc lỗi của nó –
Lớp 'QueryKey' dường như lưu chuỗi truy vấn, vì vậy điều này thực sự lạ. Tôi sẽ đặt một điểm ngắt trên 'QueryKey.generateQueryKey()' và cố gắng theo dõi tại sao đối số 'queryString' của nó là giống nhau cho hai truy vấn khác nhau. – zagyi