2013-06-12 41 views
3

我正在尋找改變維護大型網站數據的一些大型對象重新加載的方式,它們包含與目錄結構,產品等相關的數據並每天重新加載。如何比較在單獨的jvm上運行的2個大對象?

在改變它們的重載方式之後,我需要能夠看到結果數據是否有任何差異,因此我們的目的是重新加載並比較內容。

可能會有一些問題(例如,排序時使用的列表不是不重要),這會使比較更難,所以我需要能夠在比較之前更改結構。我試圖使用gson連載到json,但是內存不足。我正在考慮嘗試其他序列化方法或編寫我自己的簡單方法。

我想這是其他人在改變這樣的重要事情時會想要做的事情,但我還沒有設法找到任何關於它的事情。

+3

爲什麼不只是版本化您的數據?即保持包含版本號的單獨文件,該版本號在每次修改時遞增。 – gma

+0

@gma我需要能夠以某種方式在對象之間生成該文件。這意味着它不能有任何任意的元數據,例如java序列化輸出中的引用。此外,集合需要進行比較而不需要訂購 – MikeB

回答

1

在這種特殊情況下(單獨的虛擬機),我建議爲每個將相關內容寫入文件(人類可讀文本)的類添加類似dump方法的東西。此方法也會在每個聚合對象上調用dump

最後,您必須從每個虛擬機獲取文件,然後使用MD5校驗和比較它們。

這可能是很多工作,但是如果您遇到任何差異,您可以在這兩個文件上使用diff,這將非常有幫助。

您可以從一個簡單的版本開始,通過添加更多輸出來逐步完善它。

稍後將(完整)序列化添加到類是非常麻煩的。有些工具可以簡化這個(使用反射等),但根據我的經驗,您必須調整您的類:排除不相關的字段,爲列表定義排序順序,循環關係等。

其實我使用出於同樣的原因(檢查新版本是否仍然返回相同結果)的類似方法:應用程序包含多個服務(對於每個版本),結果始終爲數據傳輸對象,序列化立即添加到DTO,而DTO必須提供專門用於此目的的比較方法。

+0

我可能是錯的,但是這不是他們稱之爲序列化的東西嗎?就像你在最後一段中所說的那樣。 – Terence

+1

@Terence有一個區別:序列化涵蓋了所有數據(以「equal」表示),但在結果比較的情況下,您通常只對一部分字段感興趣。例如,在xxx毫秒*中在主機x上執行的元數據將被序列化,但不會進行比較。 – Beryllium

+0

我主要感興趣的是我是否可以在沒有爲所有相關類編寫自己的序列化的情況下做到這一點,不管一些常規序列化是否有效,但似乎每個人都提出同樣的問題。 – MikeB

0

看着併發症和內存問題,也正如你所提到的你不想維護版本,我會尋找使用數據庫進行比較。 將jvm中的數據映射到數據庫表中需要一些努力,但一旦你完成了這個任務,它將成爲staright的前鋒。你可以從數據庫表中的一個大對象中轉儲數據,然後你可以簡單地從數據庫中的第二個對象運行一個檢查。 創建存儲過程可以簡化事情。該解決方案可以支持來自任意數量的jvms的數據檢查。

+0

我會有興趣使用數據庫進行比較,但是,只有在有一種通用的方法來映射對象時(與序列化相同)。我不想將它映射到實體表中,因爲此對象中的數據已經從超過20個表中加載。 – MikeB