我们正在考虑在下一个项目中使用Terracotta。我对它在不需要单独的DBMS的情况下提供数据持久性的潜力很感兴趣。(另请参阅关于使用Terracotta作为持久性解决方案)
软件进化的主要痛苦之一是使现有的生产数据符合新的数据模型。对于RDBMS,您可能会在部署时使用SQL更改脚本。对于Terracotta支持的数据,我还不清楚如何处理非琐碎的进化。
Terracotta文档中有几段关于类进化的内容,但它似乎是DSO特有的,而且相当肤浅。
- 对于存储在Terracotta中的持久数据,有哪些可能的方法来处理数据模型演化我对非DSO场景特别感兴趣(即通过Terracotta Toolkit API)
- Terracotta DSO和Toolkit API对进化类定义的反应是否不同
- 为了理解类进化的局限性,了解Terracotta如何表示/传达对象数据将有所帮助;有规格吗
- 也许OODBMS世界中有一些模式进化技术适用于Terracotta
举个简单的例子,假设我存储了一堆Car
对象,并将Car
类的modelYear
字段从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"/>
从长远来看,您应该为缓存制定命名约定,其中包括版本演变。