【问题标题】:Huge Update or Inserts into DB2 using JAVA and JPA 1.0使用 JAVA 和 JPA 1.0 对 DB2 进行大量更新或插入
【发布时间】:2016-10-05 21:35:13
【问题描述】:

我有一个 JAVA 要求,我有 1500 条记录需要更新或插入到数据库中。

如果存在带有 userId 的记录,则更新它。 如果 userId 的记录不存在,则插入它。

而且,如果说第 10 条记录有错误,我需要得到 该记录的错误代码。

看起来我有两个使用 JPA 1.0 的选项

A) 触发选择以检查记录是否存在。如果是,则触发更新。如果没有,请触发插入。

B) 总是触发插入,但是我得到一个 uniqe 记录异常,然后才触发更新查询..

还有其他更有效的方法吗?如何以尽可能少的查询和尽可能快的速度做到这一点?

ENV- JAVA、JPA 1.0、DB2

【问题讨论】:

  • 不了解环境,但所描述的内容听起来像是MERGE 语句的用例;我会包含一个文档参考,但没有提及也没有包含标签来表示 DB2 变体,也没有提及给出的任何 DB2 版本。
  • 真的“只有”1500 条记录吗?或者可能是 15000 或 150000 条记录?

标签: java hibernate jpa jakarta-ee db2


【解决方案1】:

您没有指定使用哪个版本的 DB2 以及在哪个系统上。无论如何,请检查您的数据库上是否有 MERGE 语句:

9.5.0 的 LUW:http://www.ibm.com/support/knowledgecenter/SSEPGG_9.5.0/com.ibm.db2.luw.sql.ref.doc/doc/r0010873.html

Z/OS 从 10.0.0 开始:http://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/db2z_sql_merge.html

另一种方法是对每条记录执行删除 + 插入(性能不佳)。

第三种选择是创建一个动态的删除语句,在 where 子句中从您要更新的数据中列出 ID/KEY,触发删除,然后插入所有数据。

每个选项的性能将取决于表规范、索引等。

【讨论】:

    【解决方案2】:

    你可以在mysql中写如下查询

    //假设a为pk 插入表 (a,b,c) 值 (1,2,3) 在重复密钥更新 c=c+1,b=b+1; 当 pk as a=1 的记录已经存在时,此处更新将运行

    参考以下链接http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

    【讨论】:

    • OP 是 (a) 使用 DB2,而不是 MySQL,并且 (b) 寻找 JPA 解决方案,而不是用 SQL 表达的解决方案
    猜你喜欢
    • 2014-05-02
    • 2014-11-14
    • 1970-01-01
    • 2014-05-03
    • 2020-07-09
    • 2010-10-01
    • 2023-04-03
    • 2012-08-19
    • 2013-12-15
    相关资源
    最近更新 更多