我使用Spring&Spring Data JPA编写了一个小的可执行jar,以从数据库迁移数据,将对象从原始数据库(通过几个表)转换为新数据库的有效对象,然后将新对象插入新数据库。
问题是:我处理大量数据(200 000),并且一个接一个地插入确实很费时(1个小时,所有时间都花在了INSERT操作上,这是在验证/转换输入数据之后发生的,没有花用于从原始数据库检索或验证/转换)。
我已经对此有建议:
[编辑,因为我没有很好地解释它]
extract-validate-transform-insert,做我的插入(这是有效的
因为它们先被验证)由X个对象(而不是X个对象)
一一插入)。那是第一个人的建议
回答:尝试过,但是效率不高,很费时间。
而不是直接保存在数据库中,而是将插入内容保存到.sql文件中,然后将文件直接导入数据库中。但是如何将myDao.save()转换为最终的SQL输出,然后将其写入文件。
使用Talend:可能是最好的方法,但是重新进行所有操作都太长了。我想找到一种使用Java并重构我的jar的方法。
还有其他想法吗?
注意:重要的一点是,如果一个评估失败,我想继续处理其他数据,那么我只会记录一个错误。
谢谢
最佳答案
您应该停下来思考一下:将数据插入数据库时会导致什么错误?缺少“您的数据库已完成”的任务,有两种可能性:
您的代码中有一个错误;
传入的数据不好。
如果您的代码中有错误,则最好还原所有数据负载。修复代码后,您将再有一次传输数据的机会。
如果输入的数据不正确或被怀疑不正确,则应添加一个步骤来验证数据。因此,您的流程工作流程可能如下所示:提取->验证->转换->加载。如果传入的数据无效,则将其写入日志或装入单独的表以获取错误的数据。
您应该使用相同的Hibernate会话使所有进程在同一事务中运行。在内存中保留所有200K ords将被推动。我建议使用批处理(请参见http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html)。用两个词在预定数量的记录(例如1000)之后刷新并清除您的Hibernate会话。