我使用Spring& amp写了一个小的可执行jar。 Spring Data JPA从数据库迁移数据,将对象从原始数据库(通过几个表)转换为新数据库的有效对象,然后将新对象插入新数据库。
问题是:我处理大量数据(200 000)并且逐个进行插入非常耗时(1小时,所有时间都用于INSERT操作,这些操作在验证/转换传入数据后发生,它不用于从原始数据库检索,也不用于验证/转换)。
我已经有过关于它的建议:
[编辑因为我没有解释清楚]正如我正在做的那样 extract-validate-transform-insert,做我的插入(有效 因为它们是先验证的X对象是X对象(而不是 逐个插入)。 这是第一个建议 回答:尝试过,但效率不高,耗费时间。
不是直接保存在数据库中,而是将插件保存到.sql文件中,然后直接在数据库中导入文件。但是如何将myDao.save()转换为最终的SQL输出,然后将其写入文件。
使用Talend:知道可能是最好的方法,但是重新做一切都太久了。我想找到一种使用java的方法并重构我的jar。
其他想法?
注意:重要的一点是,如果一个valisation失败,我想继续处理其他数据,我只记录一个错误。
由于
答案 0 :(得分:0)
您应暂停并思考一下:将数据插入数据库时可能导致错误的原因是什么?除了“你的数据库已经被软管化”之外,还有两个可能性:
如果您的代码中存在错误,那么如果还原所有数据加载,您会更好。修复代码后,您将有另一次机会传输数据。
如果进入的数据不好或怀疑有问题,您应该添加验证数据的步骤。因此,您的流程工作流程可能如下所示:提取 - >验证 - >变换 - >加载。如果传入数据无效,请将其写入日志或加载到单独的表中以查找错误数据。
您应该使用相同的Hibernate会话保持所有进程在同一事务中运行。将所有200K的reords保留在内存中将会推动它。我建议使用批处理(参见http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html)。换句话说,在预定数量的记录(例如1000)之后,刷新并清除您的Hibernate会话。