2014-01-15 152 views
1

對於使用Oracle Coherence作爲數據存儲非常感興趣。我的理解是它可以將Java對象存儲在名稱值對中。所以問題是:Oracle Coherence的對象大小

  1. 對每個條目可以存儲的Java對象大小是否有任何限制?
  2. 是否可以存儲任何對象?

回答

0

由於Coherence是一個集羣系統,因此存儲的對象有一些要求。從http://docs.oracle.com/cd/E24290_01/coh.371/e22837/gs_intro.htm#CHDFGDIF

緩存鍵和值必須是可序列化(例如, 了java.io.Serializable)。此外,緩存鍵必須提供hashCode()和equals()方法的實現,而這些方法必須在集羣節點之間返回一致的結果。這個 意味着hashCode()和equals()的實現必須是 ,僅僅基於對象的可序列化狀態(也就是對象的非暫時性字段的 );大多數內置的Java類型(如String, Integer和Date)都符合此要求。一些緩存實現 (特別是分區緩存)使用關鍵對象的序列化形式進行相等性測試,這意味着equals()返回true的密鑰必須以相同方式序列化;大多數內置Java 類型也符合此要求。

帕特里克·佩拉爾塔這裏給出一個很好的例子:http://blackbeanbag.net/wp/2010/06/06/coherence-key-howto/

關於第一個問題:「是否有任何限制,可以每個條目存儲在Java對象大小」

  • 存在一個基於Java限制(因爲Java的某些內在部分,如數組,被設計爲32位數據結構)的大約2GB的「絕對」限制。
  • Coherence Elastic Data(透明和彈性RAM /閃存)將值限制爲64MB。

要記住的另一件事是,服務器管理的數據已經被HA複製,並在故障轉移和新服務器啓動時進行負載平衡。這意味着如果每臺服務器都管理20GB的數據(包括10GB的主要所有者和10GB的高可用性),那麼當一臺服務器死亡時,總共大約20GB將被重新實現羣集範圍的HA狀態。在千兆以太網上,服務器每秒鐘可以傳輸大約120MB的數據(即移動1GB大約需要8秒),因此具有20臺服務器(每臺管理20GB)的羣集需要大約8秒鐘的時間才能重新實現羣集範圍的HA。 (這就是爲什麼像Exalogic這樣的Oracle工程系統構建在40千兆網絡結構上的原因之一!)

爲了充分披露,我在Oracle工作。本文所表達的意見和觀點屬於我自己的觀點,並不一定反映我的僱主的意見或看法。

+0

謝謝你解釋了問題2。你能否在問題1中提出一些看法?比如說使用基於磁盤(即不存儲在內存中)的Coherence存儲方法,對象的大小是否有限制?基本上我可以像使用文件系統一樣使用它,並且因爲它內置冗餘,所以不需要使用RAID? – user192702

+0

我更新了答案。從某種意義上說,您可以將其用作啓用事件的高速「共享文件系統」,儘管它不像文件系統那樣具有分層結構。 – cpurdy

1

我正在調查幾個月前的對象大小限制問題(使用Coherence版本3.6),今天我的信息可能已過時。無法將緩存中的對象放大120 Mb(大約+ -5Mb)。我正在玩Tangosol xml設置(通過支持推薦),但沒有成功。

+0

爲什麼你不能放置大於120 MB的對象?我聽說過使用大於1 GB的對象。 – cpurdy

+0

我曾經通過C++客戶端(coherence.dll)訪問Coherence,並且在將Blob放置到120-125 Mb的過程中,我收到了長時間的java異常堆棧,而異常情況爲「小套接字緩衝區」(或類似的東西 - 這是幾個月前的我提到)最後。也許這只是C++客戶端(coherence.dll)問題。 – Kaponir