如何比较在单独的jvm上运行的2个大对象?

时间:2013-06-12 13:54:54

标签: java

我正在考虑更改维护大型网站数据的大型对象的方式,它们包含与目录结构,产品等相关的数据,并且每天都会重新加载。

在更改重新加载的方式之后,我需要能够查看结果数据是否有任何差异,因此目的是重新加载并比较内容。

可能存在一些问题(即,在订购时使用的列表并非无关紧要),这使得比较更加困难,因此我需要能够在比较之前更改结构。我曾尝试使用gson序列化到json,但我的内存不足。我正在考虑尝试其他序列化方法或编写我自己的简单方法。

我想这是其他人在改变像这样的关键事物时想要做的事情,但我还没有找到任何关于它的事情。

2 个答案:

答案 0 :(得分:1)

在这种特殊情况下(单独的VM)我建议在每个类中添加类似dump方法的内容,将相关内容写入文件(人类可读文本)。此方法也会在每个聚合对象上调用dump

最后,您必须从每个VM获取文件,然后您可以使用MD5校验和进行比较。

这可能需要做很多工作,但如果遇到任何差异,可以对这两个文件使用diff,这将是一个很好的帮助。

您可以从简单版本开始,并通过添加更多输出逐步完善它。

稍后在类中添加(完成)序列化很麻烦。可能有工具可以简化这一点(使用反射等),但根据我的经验,你必须调整你的类:排除不相关的字段,定义列表的排序顺序,循环关系等。

实际上我出于同样的原因使用了类似的方法(检查新版本是否仍然返回相同的结果):应用程序包含多个服务(对于每个版本),结果总是数据传输对象,序列化立即添加到DTO,DTO必须提供专门用于此目的的比较方法。

答案 1 :(得分:0)

查看并发症和内存问题,正如您所提到的,您不想维护版本,我会使用数据库进行比较。 在jvm中将数据映射到db表方面需要付出一些努力,但是一旦你完成了这个工作,它将是明星前进。您可以从db表中的一个大对象转储数据,然后只需从db中的第二个对象运行检查。 创建存储过程可以简化操作。此解决方案可以支持来自任意数量的jvms的数据检查。