2012-03-10 119 views
2

我们正在考虑Terracotta为我们的下一个项目。我对它提供数据持久性的潜力感兴趣,而不需要单独的DBMS。 (另请参阅On using Terracotta as a persistence solution对于兵马俑中的持久数据,如何进化类?

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

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

  1. 什么是可能的方式来处理存储在兵马俑持久性数据的数据模型演变?我对非DSO方案(即通过Terracotta Toolkit API)特别感兴趣。
  2. Terracotta DSO和Toolkit API在对进化类定义的反应方面有所不同吗?
  3. 要了解类演化的局限性,它将有助于了解Terracotta如何表示/传送对象数据;有没有一个规范?
  4. 也许有OODBMS世界中适用于兵马俑的模式演化技术?

作为一个简单的例子,假设我有一大堆的存储Car的对象,我已经改变了Car类的modelYear领域从Stringint。根据文档,这不能即时运行。我可以想象一个解决方案,我的旧Car由应用程序启动时由单独的类加载器加载,然后转换为新的Car。这是一个好方法,为什么(不)?

回答

1

这取决于你的用例场景。

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

如果您的缓存成本高(小时/天),并且您无法负担任何相当大的停机时间,那么您必须在转换期间同时处理新版本和旧版本。 对于这一点:

  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"/> 

从长远来看,你应该为你的缓存,包括进化版的锻炼命名约定。