2009-05-27 114 views
2

我有幾個類有一個屬性是唯一的對象,例如用戶類的屬性用戶名永遠不應該重複。NHibernate緩存唯一索引?

NHibernate似乎不支持通過唯一鍵加載對象,然後以與Load()或Get()相同的方式對其進行高速緩存。我說得對嗎?

如果我那麼我只需要通過LoadByUniqueIndex(lambda屬性,對象鍵)行的擴展方法來扮演我自己的角色。

回答

1

是的,你是對的,NH不直接從緩存中獲取實體,除了id之外的任何東西。請注意,除id之外的所有內容都可能會發生變化,需要在數據庫中查找。

緩存時要小心。 「過早緩存是所有邪惡的根源」或其他。嚴重的是,如果您不確定是否存在明顯的性能問題,請不要編寫自己的緩存。

  • 編寫將實體作爲參數傳遞的代碼,以避免多次加載同一個實體。
  • 避免壽命長於會話的高速緩存。如果您沒有通知所有更改,您將會有陳舊的數據。
  • 避免靜態緩存,而是使用線程靜態。這避免了在會話之間共享數據,這會破壞事務隔離。
  • 如果您真的需要它,請使用二級緩存。

如果您考慮擁有一個靜態緩存,只要應用程序運行,我就可以告訴您,您最好避免它。它不會以合理的努力正常工作。

+0

好的,謝謝Stefan,我現在暫緩。至少我肯定知道高速緩存現在如何工作。 – 2009-05-27 09:57:42