【问题标题】:Partial Data deletes using Java SQL Hibernate使用 Java SQL Hibernate 删除部分数据
【发布时间】:2014-09-19 14:18:24
【问题描述】:

我们的 Java 程序必须从 DB2 表中删除大量记录,但它的事务日志已用完。

我们正在努力增加日志空间,但由于内部流程和其他原因......这需要一周以上的时间才能完成。

我们正在寻找一种临时方法来一次删除几条记录,而不是全部删除。例如,当我们有 1000 条记录要删除时,我们希望程序一次删除 50 条记录,然后进行提交并继续执行下 50 条记录,直到删除所有 1000 条记录。如果删除X条记录后删除失败,仍然可以。

我们正在使用 Hibernate。

请求您就如何实现它提出建议。我正在考虑检查 java 中的 sqlstate 和 sqlcode,即使是在成功的 sql 执行情况下,但我不好,我找不到方法。

那么喜欢,循环做...while(检查sqlcode是否完成)

我们不能从后端删除,因为删除应该发生在来自 java Web 应用程序的用户请求上,此外,我们还有一些表约束和删除级联。

【问题讨论】:

  • 为什么不是一次大批量删除而不是全部一次删除?
  • @M.Deinum,如前所述,我们用单次批量删除的事务日志空间不足。
  • 从您的帖子中并没有那么明显的恕我直言,但唉。如果您知道要删除的 id,那么只需将它们分成可管理的块即可。您还声明您正在使用休眠,具体取决于您使用 JQL 删除记录或检索它们并删除它们或使用 SQL 将它们炸开?
  • @M.Deinum,感谢您关注并回答我的问题。这就是我们现在正在做的事情:`transaction = session.beginTransaction(); session.createSQLquery("从 id=:id 的 schema.table 中删除").setParameter("id", userinput).executeUpdate; transaction.commit();` 如果我的问题在我的帖子中不清楚,我们深表歉意。

标签: java sql spring hibernate db2


【解决方案1】:

我不知道 Hibernate,但您可以将删除更改为:

delete from (
     select * from schema.table where id=:id fetch first 50 rows only
)

假设 executeUpdate() 返回删除的行数,您可以将其放入循环中(伪代码):

... stmt = session.createSQLquery("delete from ( ... fetch first 50 rows only )");
int n = 1
while (n > 0) {
    transaction = session.beginTransaction();
    n = stmt.executeUpdate();
    transaction.commit();    
}

【讨论】:

  • 不确定语义,因此您可能必须将 stmt = ... 移动到循环内。
  • 非常感谢您的回复,非常感谢。是的,executeUpdate 将返回更新或删除的行数。
猜你喜欢
  • 2021-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-01
  • 2018-01-28
相关资源
最近更新 更多