我们正在为下一个项目考虑Terracotta。无需单独的DBMS,它就可以提供数据持久性,这让我很感兴趣。 (另请参见On using Terracotta as a persistence solution

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

有一个couple of paragraphs on Class Evolution in the Terracotta documentation,但它似乎是DSO特有的,并且仍然很肤浅。


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


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

最佳答案

这取决于您的用例场景。

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

如果填充缓存的成本很高(小时/天),并且您无法承受任何可观的停机时间,则在过渡期间必须同时处理新版本和旧版本。
为了这:


我会为任何新版本的定义单独的缓存定义
缓存的类,并让旧版本在缓存中过期。
应用程序代码也应具有“旧/新版本”支持。
拥有一个在数据之前仍然可以使用旧版本的实例
过期/过时(基于旧的缓存名称)
有一个实例,该实例使用新的实例处理了所有新的请求/流
版本(基于新的缓存名称)


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

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


从长远来看,您应该对缓存进行锻炼命名约定,其中包括版本演进。

关于java - 对于Terracotta中的持久数据,如何演化类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9642873/

10-12 06:23