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

时间:2012-03-10 00:41:16

标签: java terracotta object-persistence change-management

我们正在考虑Terracotta进行下一个项目。我对它提供数据持久性的潜力很感兴趣,而不需要单独的DBMS。 (另见On using Terracotta as a persistence solution

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

有一个couple of paragraphs on Class Evolution in the Terracotta documentation,但它似乎特定于DSO并且保持相当肤浅。

  1. 处理Terracotta中存储的持久数据的数据模型演变的可能方法是什么?我对非DSO场景特别感兴趣(即通过Terracotta Toolkit API)。
  2. Terracotta DSO和Toolkit API对进化类定义的反应有何不同?
  3. 要了解阶级演变的局限性,将有助于了解Terracotta如何表示/传达对象数据;是否有规范?
  4. 也许OODBMS世界的模式演化技术适用于Terracotta?
  5. 作为一个简单的例子,假设我存储了一堆Car个对象,并且我已将modelYear类的Car字段从String更改为int。根据文档,这不是开箱即用的。我可以设想一个解决方案,在应用程序启动期间,我的旧Car由一个单独的类加载器加载,然后转换为新的Car。这会是一个好方法,为什么(不)?

1 个答案:

答案 0 :(得分:1)

这取决于您的用例场景。

如果加载缓存的成本很少(几分钟),而且你可以负担得起停机时间......那么我认为没有简单地为新版本重建缓存的问题。

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

  1. 我会为任何新版本定义一个单独的缓存定义 缓存的类,让旧版本在缓存中过期。
  2. 应用程序代码也应该支持“旧/新版本”。
  3. 在数据之前有一个仍然可以使用旧版本的实例 expires / obsolete(基于旧的缓存名称)
  4. 让一个用新的处理所有新请求/流的实例 版本(基于新的缓存名称)
  5. e.g。在ehcache.xml中,您将定义2个缓存(基于您的示例):

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

    从长远来看,您应该为包含版本演变的缓存执行命名约定。