2009-09-16 46 views
6

如果我有一個查詢在單個線程中被多次調用,並且我只想緩存該線程的查詢(及其結果)(或者因爲每個線程使用一個會話,該會話),我怎樣才能做到這一點 ?如何僅在會話級別啓用hibernate查詢緩存?

注意:我的第二級緩存已打開,但主要用於session.get(...)。但我不想將它用於查詢緩存,因爲我只需要它在我的線程(/ session)期間存活。

謝謝

回答

0

我不知道任何這樣的Hibernate功能。

但是,這似乎是一個非常有限和可管理的上下文。我會盡力做到這一點是代碼。看起來可能有多種方式:

  • 如果您的代碼是衆所周知的,則複雜性是可管理的。假設你有一個代碼A,它調用代碼B和C,它們都需要查詢。您可以在A中運行查詢一次,因爲將結果傳遞給B和C。也許你已經有了發送給B和C的上下文對象?這將是簡單,優雅,有意義...
  • 假設相反,你的代碼是一個真正的混亂,你不能傳遞一個上下文。你可以有一個ThreadLocal變量,它包含結果。如果未在當前線程中設置,請調用並存儲它。否則,只需檢索它。

    請注意,在第二種情況下,您必須在外出時清理ThreadLocal。

  • 這些對立面之間,解決方案是可能的,其中一人可能是比別人更好...

2

查詢緩存不能被應用到會話緩存。這是有道理的,因爲通常所有針對會話的操作都是由一段代碼完成的,它應該能夠記住結果本身。

你說你不想啓用二級查詢緩存,但這樣做會造成什麼危害?你會得到你想要的結果。

+0

由於http://darren.oldag.net/2009/05/hibernate-wars-query-cache-strikes-back.html和其他警告。另外,我真的沒有任何理由讓它活躍超過我的線程。 – 2009-09-16 13:53:24

+0

+1。我在下面提供了一些關於如何將查詢緩存生命期限制爲會話(或其他選定期限)的細節,但我完全同意skaffman--你必須有一個非常特殊的例子來說明這一點。 – ChssPly76 2009-09-16 15:29:15

5

這裏的底線是:您可以手動緩存您的查詢結果,也可以讓Hibernate執行此操作。

1)Enable query cache

2)有關奉獻的特定區域進行查詢,並將其標誌:雖然一般意義不大查詢緩存生命限制該屆會議,它可以使用下面的方法來完成可緩存:

Query query = ...; 
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY"); 

3)在會議結束驅逐出緩存查詢(如果你真的肯定這就是你想要做什麼):

SessionFactory sessionFactory = ...; 
sessionFactory.evictQueries("MY_SPECIAL_QUERY"); 
相關問題