2013-06-12 23 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