3

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

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

可能存在一些问题(即,当排序不重要时使用的列表)使比较更加困难,所以我需要能够在比较之前改变结构。我曾尝试使用 gson 序列化为 json,但内存不足。我正在考虑尝试其他序列化方法或编写自己的简单方法。

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

4

2 回答 2

1

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

最后,您必须从每个 VM 获取文件,然后您可以使用例如 MD5 校验和来比较它们。

这可能是很多工作,但如果您遇到任何差异,您可以diff在两个文件上使用,这将是一个很大的帮助。

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

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

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

于 2013-06-12T14:41:43.360 回答
0

查看并发症和内存问题,也正如您提到的您不想维护版本,我希望使用数据库进行比较。在将 jvm 中的数据映射到 db 表方面需要付出一些努力,但是一旦你做到了,它就会很顺利。您可以从 db 表中的一个大对象转储数据,然后您可以简单地从 db 中的第二个对象运行检查。创建存储过程可以简化事情。该解决方案可以支持来自任意数量的 jvm 的数据检查。

于 2013-06-12T15:05:51.847 回答