【问题标题】:Hibernate bulk operations migrate databasesHibernate 批量操作迁移数据库
【发布时间】:2014-03-21 16:32:33
【问题描述】:

我使用 Spring 和 Spring Data JPA 编写了一个小的可执行 jar 来从数据库迁移数据,将对象从原始数据库(通过几个表)转换为新数据库的有效对象,然后将新对象插入新数据库。

问题是:我处理大量数据(200 000)并且一个一个地插入真的很耗时(1小时,所有时间都花在验证/转换传入数据后发生的插入操作上,它不用于从原始数据库检索或验证/转换)。

我已经有建议了:

  • [编辑因为我没有解释清楚] 因为我正在做 extract-validate-transform-insert,做我的插入(这是有效的 因为它们首先被验证)X 个对象由 X 个对象(而不是 一一插入)。 这是一开始的建议 回答:试过了,但效率不高,还很费时间。

  • 不是直接保存在数据库中,而是将插入保存到 .sql 文件中,然后将文件直接导入数据库中。但是如何将 myDao.save() 转换为最终的 SQL 输出,然后将其写入文件。

  • 使用 Talend:知道可能是最好的方法,但时间太长,无法重新做所有事情。我想找到一种使用 java 的方法并重构我的 jar。

  • 其他想法?

注意:重要的一点是,如果一个验证失败我想继续处理其他数据,我只会记录一个错误。

谢谢

【问题讨论】:

    标签: java mysql sql spring hibernate


    【解决方案1】:

    您应该停下来想一想:将数据插入数据库时​​会导致错误的原因是什么?除了“您的数据库已被冲洗”之外,还有两种可能性:

    1. 您的代码中存在错误;
    2. 传入的数据不好。

    如果您的代码中有错误,最好还原所有数据加载。修复代码后,您将获得另一次传输数据的机会。

    如果传入的数据是错误的,或者被怀疑是错误的,您应该添加一个步骤来验证您的数据。因此,您的流程工作流程可能如下所示:提取 --> 验证 --> 转换 --> 加载。如果传入的数据无效,则将其写入日志或加载到单独的表中以获取错误数据。

    您应该使用相同的 Hibernate 会话保持所有进程在同一事务中运行。将所有 200K 记录保存在内存中将推动它。我建议使用批处理(参见http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/batch.html)。简而言之,在预定数量的记录(例如 1000 条)之后,刷新并清除您的 Hibernate 会话。

    【讨论】:

    • 感谢您的回答,目前:-> 错误:数据错误(已验证)。 -> 我已经进行了提取、验证、转换、加载 -> 验证步骤:错误的传入数据创建了一个日志,然后我进入下一个验证 -> 我在原来的帖子中弄错了,我现在要编辑它.所以我可以安全地使用 X 对象处理我的插入并刷新,我会看看它做了什么。 - Hibernate 批处理样式仍然太长。 -> 让我们试试我的其他猜测:我可以将它写入 .sql 文件以便稍后加载(使用数据库 sql 文件加载比插入对象更快)
    • @Steph0:比起 MySQL,我更熟悉 Oracle 和 PostgreSQL。乍一看 MySQL 文档,看起来 LOAD DATA INFILE 应该符合要求,但我知道 MySQL 可以配置为使用不同的数据引擎,并且该命令不一定普遍适用。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2016-09-17
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多