2014-02-26 29 views
0

在我的Web應用程序中,我有一個工作正在執行大量的寫查詢。這項工作必須運行得非常快,這就是爲什麼我使用無狀態會話SELECT查詢不使用緩存

因此,只要我必須更新或插入一個實體,我正在使用這個無狀態會話

但是,要檢索我的作業中使用的數據,我正在使用普通會話(由Play Framework創建的會話),以便加載關係。

這通常工作正常,因爲我使用普通會話檢索作業開始處的數據,然後使用無狀態會話更新和插入更改(因此2個會話之間沒有衝突)。

但是,我現在有這個解決方案的問題。我有一個實體,我也從另一份工作中更新。在我的第一份工作中,我需要這個實體的最後更新(我需要這個實體在我的作業之間同步)。因此,當我需要它時,我使用新的SELECT檢索它,但該實體不包含上次更新!

我認爲這是因爲緩存。當使用無狀態會話在另一個作業中更新此實體時,正常會話的緩存不會更新,然後當我執行我的SELECT查詢以檢索上次更新時,我只是得到緩存中的內容(這不是最後一個更新)。

因此,要解決我的問題,我想知道是否有可能執行SELECT與Hibernate查詢,而不使用緩存。其實我想迫使休眠執行一個新的真實選擇查詢不使用緩存檢索數據庫的最後更新。

你有什麼想法嗎?

編輯

我使用JPA

回答

0

使用JPA來更新數據庫中的實體我使用了刷新功能,它可以工作。

entityManager.refresh(entity); 
1

如果你不想Hibernate來利用其一級緩存就可以清除緩存之前發射的HQL。

  • 使用Session.evict()從緩存
  • 使用Session.clear()刪除特定實體清除會話的整個一級緩存

但是,如果你的工作並行執行這將不利於你,因爲你的數據庫的事務隔離。更多herehere。在這種情況下,您唯一的選擇是將事務隔離級別設置爲read uncommitted/dirty(我不推薦)。

+0

謝謝你的回答。不幸的是它不適合我。使用clear()會導致我的工作崩潰,因爲我試圖更新似乎被分離的實體或其他東西。 evict()沒有效果(可能是因爲我使用的是JPA?)。但是,使用JPA我找到了一個解決方案(我會寫答案) –