2011-03-29 142 views
6

我們現在使用Hazelcast作爲Hibernate二級緩存,但是在使用多個節點時正在識別存儲和讀取數據的長時間延遲。Hibernate延遲加載和Hazelcast

我們大量使用組合對象和@OneToMany關係,爲了提高性能,我們決定通過Hibernate延遲加載來加載這些組合對象或集合。我們還實施了DataSerializable以加速Hazelcast序列化,正如Hazelcast文檔中所述。但是記錄writeData/readData方法的使用表明我們實際上並未使用它們!如果Hibernate代理(通過延遲加載使用)阻止使用DataSerializable方法(因爲代理本身可能(?)不實現接口),以及 - 更重要的是 - 如果我們現在還不清楚Hazelcast完全支持懶加載 - 以及如何!

回答

5

Hazelcast的DataSerializable對Hibernate L2緩存沒有用處,因爲Hazalcast集羣中存儲的對象不是您的實體對象。 Hibernate在L2中使用它自己的數據(比如說序列化)格式,將你的實體及其關係和集合轉換成它自己的格式,並給它自己的對象(實現java.io.Serializable)給Hazelcast。 Hazelcast使用標準的Java序列化對這些序列化,並跨羣集分發。

如果您的類具有複雜和深度的對象圖(密集使用組合對象和1xn或類似關係),則此雙序列化問題會導致長時間延遲。

Hazelcast與Hibernate的延遲加載無關。 Hibernate已經分別存儲實體及其關係和集合映射。所有這些都可以從Hazelcast一個接一個地加載。但是在你的用例中,如果大多數延遲加載的關係總是被加載,那麼這將導致多個遠程Hazelcast調用,而不是一個。所以你應該仔細考慮在哪裏使用延遲加載。

另一個訣竅是使用/啓用Hazelcast near-cache,如果您的應用程序主要是隻讀的。 (順便說一句,如果不是這樣,那麼使用L2緩存可能不適合你。)這樣你將節省大量的遠程調用,並且頻繁需要的數據將被緩存在本地。近緩存支持所有Hazelcast地圖屬性,如TTL,驅逐,最大尺寸等

Hazelcast Near-Cache documentation...

+0

感謝您的偉大的答案,這幫助了我們很多。 – Andreas 2011-04-14 11:04:41

+0

不客氣。 – mmdogan 2011-04-15 18:19:03