2013-08-27 54 views
0

考慮:正在編寫自定義緩存機制是一個好主意嗎?

  • 我使用NHibernate的爲Web應用程序
  • 在我的Web應用程序數據庫實體由「Orgnanization」爲他們創造至極分離,並通過至極使用它們。 (一個組織的用戶不能訪問另一個組織的實體)。
  • 數據庫實體有一個簡單的PK
  • 我的NHibernate SessionFactory是在應用程序級別的單例。
  • 我的NHibernate會話在Web請求的開始處打開,並在其結尾處關閉。
  • 商務服務是無國籍的。
  • 由於所有上述我們的結果與數據庫實體的工作如下:

    變種實體= repository.Load(ENTITYID,currentUserId);

問題:

  • 是否有緩存數據庫實體的請求的有用方法是什麼?
  • 使用存儲在HttpContext中的線程安全哈希表,在存儲庫 級別編寫我自己的緩存機制是一個好主意嗎?
+0

我並不十分清楚爲什麼要構建緩存。請注意,NHibernate已經爲你做了一些緩存,即使沒有啓用二級緩存。請參閱http://nhforge.org/doc/nh/en/index.html#performance-sessioncache。 「每當您將對象傳遞給Save(),Update()或SaveOrUpdate()時,只要您使用Load(),Get(),List()或Enumerable()檢索對象,該對象就會添加到內部緩存中的ISession。「 –

+0

我知道一級緩存,它不適用於我的情況。我所有的實體不僅由PK加載,而且PK + OrganizationId需要加入至少1個附加表。 (選擇*從實體左加入用戶user.userid = entity.userid其中user.organizationid =:OrganizationId)。而且,當我們在一次會話中多次加載一個實體時,業務邏輯的複雜性使我們轉向了一些功能風格。根據查詢分析,我們有20個重複查詢到數據庫,有時候我們只有一個。 – Anubis

回答

0

我不會在存儲庫級別實現這種緩存。您正在引入對HttpContext的依賴關係,如果您想在測試中執行控制器操作,或者甚至只是在利用您的回購的控制檯應用程序中編寫一些作業,那就很棘手。

你看過NHibernate's 2nd level cache嗎?

+1

感謝您的回覆。我實際上使用了一個包裝HttpContext的容器。所以有時候它是CallContext。我至少在請求期間使用它來存儲NHibernate會話。沒有什麼棘手的,我認爲嘲笑測試的上下文。談論第二層NHibernate緩存,據我所知它是會話工廠級別,並不完全如我所願。 – Anubis

相關問題