对于Terracotta中的持久数据,如何演化类



我们正在考虑在下一个项目中使用Terracotta。我对它在不需要单独的DBMS的情况下提供数据持久性的潜力很感兴趣。(另请参阅关于使用Terracotta作为持久性解决方案)

软件进化的主要痛苦之一是使现有的生产数据符合新的数据模型。对于RDBMS,您可能会在部署时使用SQL更改脚本。对于Terracotta支持的数据,我还不清楚如何处理非琐碎的进化。

Terracotta文档中有几段关于类进化的内容,但它似乎是DSO特有的,而且相当肤浅。

  1. 对于存储在Terracotta中的持久数据,有哪些可能的方法来处理数据模型演化我对非DSO场景特别感兴趣(即通过Terracotta Toolkit API)
  2. Terracotta DSO和Toolkit API对进化类定义的反应是否不同
  3. 为了理解类进化的局限性,了解Terracotta如何表示/传达对象数据将有所帮助;有规格吗
  4. 也许OODBMS世界中有一些模式进化技术适用于Terracotta

举个简单的例子,假设我存储了一堆Car对象,并将Car类的modelYear字段从String更改为int。根据文件,这不是开箱即用的。我可以想象一个解决方案,在应用程序启动期间,我的旧Car由一个单独的类加载器加载,然后转换为一个新的Car。这是一个好方法吗?为什么(不)?

这取决于您的用例场景。

如果加载缓存的成本是最低的(分钟),并且您可以承受停机时间。。。那么我认为简单地为新版本重建缓存没有问题。

如果填充缓存的成本很高(小时/天),并且无法承受任何相当大的停机时间,那么在过渡期内,您必须同时处理新版本和旧版本。为此:

  1. 我会为任何新版本的缓存的类,并让旧版本在缓存中过期
  2. 应用程序代码也应该支持"旧版本/新版本"
  3. 拥有一个在数据之前仍能使用旧版本的实例过期/过时(基于旧缓存名称)
  4. 拥有一个处理所有新请求/流的实例版本(基于新的缓存名称)

例如,在ehcache.xml中,您将定义2个缓存(基于您的示例):

<cache name="com.xyz.Car" timeToLiveSeconds="600"/>
<!--New version goes here-->
<cache name="com.xyz.Car2" timeToLiveSeconds="600"/>

从长远来看,您应该为缓存制定命名约定,其中包括版本演变。

最新更新