一、 引言
内存缓冲在大规模企业应用软件开发过程中是一个关键的技术,其中往往都有可伸缩性和高性能的需求。一个内存缓冲能存储应用程序状态信息(如,一个web应用程序中的httpsession)或数据库查询结果(也即,实体数据)。 由于许多企业应用软件运行在一个簇环境下,所以缓存需要跨越簇进行复制。而且,如果需要更高的可靠性的话,内存缓冲也应该被持续性存储到硬盘或数据库中去。
大多数内存缓冲解决方案都属于我们所称的"普通"缓存系统类——其中存储和缓冲直接参考的对象。既然一个普通缓存直接处理参考对象,那么它就象一个详尽的hashmap结构一样,并因此使用起来非常直观。当一对象需要被复制或持续存储到一个普通缓存系统中时,对象必须实现serializable接口。然而,普通缓存在复制或持续存储方面也存在一些明显的限制:
·用户必须具体地管理该缓存。例如,当一对象被更新时,用户需要执行一相应的api来更新缓存内容。
·java对象串行化的需要可能会对性能有所妨碍。如果对象是巨大的,甚至单个的字段更新也将会激活整个对象的串行化与跨整个簇的复制。这样可能带来不必要的昂贵的代价。
·java对象串行化不可能保存缓冲对象之间的关系。特别地,该缓冲对象不可能被其它对象参考多次(多参考),或到其自身有一个间接参考(循环)。否则,在串行化时该关系将被打破。例如,图1说明在复制期间的这个问题。如果我们有两个共享同一个address对象的person实例,那么在复制时它将被拆分成两个独立的address实例(而不是一个)。