2012-03-10 46 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"/> 

從長遠來看,你應該爲你的緩存,包括進化版的鍛鍊命名約定。