2008-10-23 40 views

回答

8

先讓它工作,然後讓它快速。如果你不需要緩存,不要實現它。

+0

同意。性能不會是一個問題,直到它成爲一個問題... – 2008-10-28 16:47:57

2

我對Hibernate的使用一直存在於另一個框架(例如Spring)的上下文中,其中啓用緩存幾乎是微不足道的。一些這些項目已經通過ehcache對一些關鍵的域類使用緩存。

話雖如此,這是我們必須在資源之間進行權衡的另一個領域 - 平衡檢索性能和內存使用。沒有測量的優化一再被證明是不好的練習。

收集有關應用程序性能的度量標準。然後決定如何解決慢點。緩存可能是您最擔心的問題。

3

在我所使用的應用程序中,數據庫在多個應用程序之間共享,其中一些應用程序根本不是Java。因此,在這些情況下,二級緩存不適合我,因爲我永遠不知道其他應用何時可以更新數據庫。

1

如果你做正確的事情(小心的選擇N + 1等),性能應該是可以接受的,而不絕大多數情況下

1

的二級緩存,我們首先嚐試沒有,只有使用它的時候的表現下跌降落。

0

引用着名的Donald Knuth的話:「程序員浪費大量時間思考或擔心程序中非關鍵部分的速度,而這些效率的嘗試實際上在調試和維護時會產生強烈的負面影響我們應該忘記小效率,大約97%的時間:不成熟的優化是萬惡的根源,但我們不應該把這個關鍵的3%放在一邊。「

如果您看到性能問題,只有這樣您才能開始優化。如果需要的話,你應該只優化最大的瓶頸,並按照你的方式進行工作。

但是,在大多數情況下,在NHibernate中實現這種優化對調試和維護的影響可以忽略不計,而且通常可以通過非常少的代碼添加來實現。

如果您廣泛依賴延遲加載,只讀表,不必擔心與不使用NHibernate的應用程序併發,性能是一個問題,並且您對如何使用二級緩存進行優化(這意味着您已經知道這個問題的答案),那麼你應該使用二級緩存。

0

現在有一個與hibernate相關的特定問題。臭名昭着的LazyInitializationException。基本上,您需要初始化所有惰性關聯,而實體則附加到持久性上下文。兩種方法:

  1. 手動訪問關係以強制加載它們。
  2. 使用指定聯合抓取的查詢。

這兩種方法會導致完全不同的代碼段,因此將一個代碼移植到另一個代碼段可能是一項相當不錯的工作。問題在於方法1。在不使用二級緩存時會導致大量查詢,因此人們可以決定使用方法2,這會導致發燒查詢。但是,稍後您打開第二級緩存時,方法2中的查詢不會從緩存中加載數據,但會將結果實體放入緩存中,從而使查詢執行速度比沒有緩存時慢。這會導致複雜的事情,比如不得不使用查詢緩存。

因爲,它似乎更好的方法,我(在這種特殊情況下)在第一次爲所有實體,通常是微不足道的,以使高速緩存,然後禁用它的實體,你不需要它作爲開發流程的上。

相關問題