如果我有一個查詢在單個線程中被多次調用,並且我只想緩存該線程的查詢(及其結果)(或者因爲每個線程使用一個會話,該會話),我怎樣才能做到這一點 ?如何僅在會話級別啓用hibernate查詢緩存?
注意:我的第二級緩存已打開,但主要用於session.get(...)。但我不想將它用於查詢緩存,因爲我只需要它在我的線程(/ session)期間存活。
謝謝
如果我有一個查詢在單個線程中被多次調用,並且我只想緩存該線程的查詢(及其結果)(或者因爲每個線程使用一個會話,該會話),我怎樣才能做到這一點 ?如何僅在會話級別啓用hibernate查詢緩存?
注意:我的第二級緩存已打開,但主要用於session.get(...)。但我不想將它用於查詢緩存,因爲我只需要它在我的線程(/ session)期間存活。
謝謝
我不知道任何這樣的Hibernate功能。
但是,這似乎是一個非常有限和可管理的上下文。我會盡力做到這一點是代碼。看起來可能有多種方式:
假設相反,你的代碼是一個真正的混亂,你不能傳遞一個上下文。你可以有一個ThreadLocal變量,它包含結果。如果未在當前線程中設置,請調用並存儲它。否則,只需檢索它。
請注意,在第二種情況下,您必須在外出時清理ThreadLocal。
這些對立面之間,解決方案是可能的,其中一人可能是比別人更好...
查詢緩存不能被應用到會話緩存。這是有道理的,因爲通常所有針對會話的操作都是由一段代碼完成的,它應該能夠記住結果本身。
你說你不想啓用二級查詢緩存,但這樣做會造成什麼危害?你會得到你想要的結果。
這裏的底線是:您可以手動緩存您的查詢結果,也可以讓Hibernate執行此操作。
2)有關奉獻的特定區域進行查詢,並將其標誌:雖然一般意義不大查詢緩存生命限制該屆會議,它可以使用下面的方法來完成可緩存:
Query query = ...;
query.setCacheable(true).setCacheRegion("MY_SPECIAL_QUERY");
3)在會議結束驅逐出緩存查詢(如果你真的肯定這就是你想要做什麼):
SessionFactory sessionFactory = ...;
sessionFactory.evictQueries("MY_SPECIAL_QUERY");
由於http://darren.oldag.net/2009/05/hibernate-wars-query-cache-strikes-back.html和其他警告。另外,我真的沒有任何理由讓它活躍超過我的線程。 – 2009-09-16 13:53:24
+1。我在下面提供了一些關於如何將查詢緩存生命期限制爲會話(或其他選定期限)的細節,但我完全同意skaffman--你必須有一個非常特殊的例子來說明這一點。 – ChssPly76 2009-09-16 15:29:15