1

我正在研究 ibm websphere commerce (wcs)。在这个框架中,我们可以选择缓存我们的命令类,基本上它们只是一个 java 类。在有一个新的缓存条目时,我知道这些 java 类必须是可序列化的(实现 java.io.Serializable 接口)。这是为什么?

是不是缓存基本上是在保存一些执行的输出?在这种情况下,它将保存作为序列化的一部分生成的字节序列,并且每当对该缓存对象的请求出现时,它只会反序列化并返回对象而不执行实际程序?任何人都可以分享这方面的知识吗?

在此先感谢,桑托什

4

3 回答 3

6

对于缓存方法执行的结果并将其返回以供后续调用序列化是不需要的。

它需要可序列化的最可能原因是,当您在集群环境中缓存某些数据时,对一个节点上的缓存数据所做的更改必须复制到集群的其他节点上。为了进行这种复制,需要使用一些远程 API 对数据进行序列化并发送到另一个节点。

要求类可串行化的另一个原因是缓存实现可能会将数据溢出到磁盘。即使在这种情况下,缓存中的对象也需要转换为可以存储在磁盘上并重新创建的某种形式。

以下是ehcache 文档中的一段,更详细地解释了溢出场景。

当一个元素被添加到缓存并且超出其最大内存大小时,如果 overflowToDisk 为假,则删除现有元素,或者如果 overflowToDisk 为真,则评估是否假脱机到磁盘。

在后一种情况下,将执行到期检查。如果过期则删除;如果不是,它是假脱机的。从内存存储中逐出项目基于配置文件中指定的“MemoryStoreEvictionPolicy”设置。

于 2012-06-27T13:40:37.150 回答
0

序列化将实际对象本身保存为当前状态。

于 2012-06-27T13:37:02.210 回答
0

原因在于 WebSphere Commerce 使用了 WebSphere Application Server 的 Dynacache 特性。WAS dynacache 是一种内存中的 java 缓存,与内置的 memcached 非常相似。开箱即用,原型商店使用动态缓存来缓存 JSP、servlet、控制器、命令、命令任务和其他 java 对象。在数据库端也进行了缓存。这就是为什么在性能测试中,IBM 在大容量下的扩展能力比其他软件要好得多。

于 2013-02-26T00:54:05.923 回答