2013-09-23 49 views
1

我一直在調試一些奇怪的行爲envers在我的代碼了幾天,無意中發現了一些讓我感到驚訝。我已經證實,這不會對我的問題造成影響,但我認爲這值得檢查我的假設。多個休眠envers FirstLevelCache實例

如果我能在一個單獨的線程(我使用的線程會話上下文)在多個地方當前Hibernate會話我總是會得到相同的會話,因此我會打相同的一級緩存。

在獲得審計讀取器實例時,我曾經假設envers具有類似的行爲。我正在使用AuditReader reader = AuditReaderFactory.get(session);獲取AuditReader實例。我注意到每次調用時(即使在同一個會話上下文中),我都會得到一個新的審計讀取器實例,其中包含一個唯一的第一級緩存實例。

它看起來像這將導致,充其量,在多個可能重疊緩存的性能損失。

我認爲,對於一個會話上下文,我總是得到相同的AuditReader實例,因此,單一的一級緩存。我想不出爲什麼會出現這種情況。

這給我留下了四種可能性:

  1. 我沒有使用正確的方法來獲取會話環境審計讀者
  2. 有一個很好的理由有多個審計讀者實例
  3. 有一個在envers深處的某處的錯誤
  4. 重用審計讀取器實例沒有意義。

是否有人可以提供這方面的一些見解。

謝謝。

+0

會話是如何綁定到線程的,以及如何從中讀取數據......我知道它是一項簡單的任務,但是存在大問題......換句話說,請分享有問題的代碼。 –

+0

@AnanthaSharma我有一個'SessionFactory'的單個靜態實例,並使用'final Session session = sessionFactory.getCurrentSession()'來獲取當前的Hibernate上下文會話。 – subie

+0

你如何將會話綁定到一個線程並訪問它..有可能是錯誤的那裏.. –

回答

1

如果你看看AuditReaderFactoryhere)的實現,每次調用都會創建一個AuditReaderImpl的新實例;這些實例本身並沒有被緩存。

它不是在任何地方指定,你應該得到相同的實例給同一個會話;所以你的請求可以被視爲「功能請求」,但我不會說這是一個錯誤。

沒有具體原因不重複使用相同的審計閱讀器實例。

+0

來提名線程上下文管理。謝謝@adamw我會記住這一點。事實上,考慮到這一點,歷史實體的一級緩存與當前實體的一級緩存非常不同,因爲歷史實體是不可變的。因此,無論會話如何,歷史實體都可以考慮單個緩存,這需要一個老化策略。考慮到這一點,堅持目前的策略可能會更容易:) – subie