簡體   English   中英

從JPA / Hibernate / EclipseLink替換查詢緩存中的單個實體?

[英]Replace single entity in query cache from JPA/Hibernate/EclipseLink?

我們需要緩存查詢結果; 該查詢返回數據庫的整個表。 問題是數據庫被其他應用程序從外部更改。 進行查詢的Java應用程序將收到更改行的確切主鍵的通知。

是否可以僅替換查詢緩存中更改的元素,而不替換整個列表? 這是一級緩存(來自EntityManager)還是二級緩存(來自EntityManagerFactory)還是其他緩存?

如果可以,可以通過JPA完成嗎?

entityManager.refersh(entity);

還是此查詢緩存是二級JPA緩存:

entityManagerFactory.getCache().evict(cls, primaryKey);

還是只能通過Hibernate / EclipseLink API進行?

如果不可能,為了實現這一點,是否可以在所有元素上調用entityManager.find()

Hibernate文檔EclipseLink文檔中都找不到有用的東西。 Hibernate支持區域並僅刷新區域,但是我們需要實體級的刷新粒度。


以后編輯以澄清我的發現。

跟隨@Chris在評論中發布的鏈接,我發現EclipseLink實際上支持我想要的內容但僅對Oracle Database支持(可以為其他供應商實現自己的處理程序;但是來自數據庫的調用未標准化,並且有所不同從一個供應商到另一個供應商)。 我還沒有發現Hibernate是否支持。

無論如何,與Spring Cache(基於CocurrentMap)或基於自定義的緩存相比,EclipseLink的查詢緩存的性能都非常差,因此將保留在Spring Cache或Spring Jdbc上的Custom Cache中。

EntityManager.refresh()是您想要的-它從數據庫中的內容刷新實體。 如果您不在事務中,這還應該更新共享緩存中的實體,否則,您可能需要使用entityManagerFactory.getCache()。evict(cls,primaryKey);。 以及清除第二級共享緩存,以便以后也可以將其讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM