我们正在考虑Terracotta进行下一个项目。我对它提供数据持久性的潜力很感兴趣,而不需要单独的DBMS。 (另见On using Terracotta as a persistence solution)
软件发展的主要痛苦之一是使现有的生产数据符合新的数据模型。对于RDBMS,您可能在部署时使用SQL更改脚本。对于Terracotta支持的数据,我不清楚如何处理非平凡的进化。
有一个couple of paragraphs on Class Evolution in the Terracotta documentation,但它似乎特定于DSO并且保持相当肤浅。
作为一个简单的例子,假设我存储了一堆Car
个对象,并且我已将modelYear
类的Car
字段从String
更改为int
。根据文档,这不是开箱即用的。我可以设想一个解决方案,在应用程序启动期间,我的旧Car
由一个单独的类加载器加载,然后转换为新的Car
。这会是一个好方法,为什么(不)?
答案 0 :(得分:1)
这取决于您的用例场景。
如果加载缓存的成本很少(几分钟),而且你可以负担得起停机时间......那么我认为没有简单地为新版本重建缓存的问题。
如果您填充缓存(小时/天)的成本很高,而且您无法承受任何相当大的停机时间,那么您必须在过渡期间同时处理新旧版本。 为此:
e.g。在ehcache.xml中,您将定义2个缓存(基于您的示例):
<cache name="com.xyz.Car" timeToLiveSeconds="600"/>
<!--New version goes here-->
<cache name="com.xyz.Car2" timeToLiveSeconds="600"/>
从长远来看,您应该为包含版本演变的缓存执行命名约定。