2014-01-15 87 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