gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:46:42 25 4
gpt4 key购买 nike

我们正在考虑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 在对进化类定义的 react 上是否不同?
  3. 要了解类进化的局限性,了解 Terracotta 如何表示/传达对象数据会有所帮助;有这方面的规范吗?
  4. 也许有适用于 Terracotta 的 OODBMS 世界的模式演化技术?

作为一个简单的例子,假设我存储了一堆 Car 对象,并且我已经更改了 CarmodelYear 字段从 Stringint 的类。根据文档,这不是开箱即用的。我可以想象一个解决方案,我的旧 Car 在应用程序启动期间由单独的类加载器加载,然后转换为新的 Car。这是一个好方法吗?为什么(不是)?

最佳答案

这取决于您的用例场景。

如果加载缓存的成本很低(几分钟)并且您可以承受停机时间...那么我看不出为新版本简单地重建缓存是没有问题的。

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com