我只使用Hibernate及其L1(會話)高速緩存。我想知道是否可以預先填充它。預填充Hibernate L1高速緩存
假設我有一個Item
表,每個項目都有自己的id
,我需要發出查詢,如「from Item where id = :id
」:如果我能預先加載一次我能有更快的響應時間的所有項目(I」從Tomcat下的Servlet中使用Hibernate)。
我只使用Hibernate及其L1(會話)高速緩存。我想知道是否可以預先填充它。預填充Hibernate L1高速緩存
假設我有一個Item
表,每個項目都有自己的id
,我需要發出查詢,如「from Item where id = :id
」:如果我能預先加載一次我能有更快的響應時間的所有項目(I」從Tomcat下的Servlet中使用Hibernate)。
是的,這是可能的。您將執行一次選擇(沒有where條件並且沒有使用結果列表),然後數據在會話的第一級緩存中,直到您清除會話或將其丟棄。
但是在這種情況下,如果會話本身拋出緩存中的預加載數據(這不是一個功能問題,只是性能問題,而且我有這種感覺,使用從不這樣做)。如果你想完全控制,你可以將預加載的數據存儲在一個靜態變量(一個List或Map實例)中,然後編寫一個從該靜態變量讀取數據的服務。順便說一句,在你的環境中,對這個靜態變量的訪問必須是同步的。
這是一個非常危險的事情,因爲你可能會返回陳舊的數據。如果要緩存多個會話/事務的項目,最好使用Hibernate的二級緩存:它將是透明的,並且在項目被修改時會被更新。爲什麼重新發明輪子? –
如果將它緩存爲只讀,則不會造成危險(請注意,延遲加載,即全部加載或不關閉會話)。關閉會話後的修改是不可能的,不同線程同時修改(都屬於同一個會話,並且hibernate會話不是線程安全的)。但這一切都是由L1高速緩存的問題所暗示的。 – Johanna
我指的是將預先加載的數據存儲在靜態List或Map中的建議。你最好使用L2 chache而不是實現你自己的。 –
會話高速緩存是一個非常短暫的高速緩存,其生存期通常是單個事務的生命週期:幾毫秒,並且不在多個併發線程之間共享。如果您需要在交易中通過ID獲取幾乎所有物品,那麼是的,您可以預先加載所有物品。否則,我不明白這一點。 –
閱讀這篇文章(https://community.jboss.org/wiki/UsingHibernateWithTomcat),我瞭解到應該讓一個會話在Servlet的整個生命週期中保持打開狀態,這個持續時間可能會持續幾秒鐘...... – cdarwin
我無法訪問這篇文章,但是這裏是官方hibernate文檔中關於Session的內容:*表示應用程序和持久性存儲之間的對話的單線程,短期對象。包裝一個JDBC java.sql.Connection。* –