gpt4 book ai didi

java - 使用 Hibernate 和多线程批量更新 DB2

转载 作者:行者123 更新时间:2023-12-02 10:18:00 26 4
gpt4 key购买 nike

我需要更新 DB2 数据库中超过 1000000 条记录。我尝试使用 hibernate 与多线程应用程序更新记录。然而,这样做时我遇到了lockacquisitionException。我觉得这是因为我正在与多个线程一起进行批量提交。有人可以推荐更好的解决方案或更好的方法吗?如果我需要上传我正在使用的代码,请告诉我。提前致谢。

//Code running multiple times with threads 
Transaction tx = null;
tx = session.beginTransaction();
for(EncryptRef abc : arList) {
String encrypted = keyUtils.encrypt(abc.getNumber()); //to encrypt some data
Object o = session.load(EncryptRef.class,new Long(abc.getId())); //primary key EncryptRef object = (EncryptRef)o;
object.setEncryptedNumber(encrypted); //updating the row
}
tx.commit(); //bulk commiting the updates

表仅包含三列。 ID|明文|加密文本

更新:我尝试使用 JDBC 准备的语句进行批量更新。但是,我仍然面临以下异常:

com.ibm.db2.jcc.am.BatchUpdateException: [jcc][t4][102][10040][3.63.75] Batch failure. The batch was submitted, but at least one exception occurred on an individual member of the batch. Use getNextException() to retrieve the exceptions for specific batched elements. ERRORCODE=-4229, SQLSTATE=null at com.ibm.db2.jcc.am.fd.a(fd.java:407) at com.ibm.db2.jcc.am.n.a(n.java:386) at com.ibm.db2.jcc.am.zn.a(zn.java:4897) at com.ibm.db2.jcc.am.zn.c(zn.java:4528) at com.ibm.db2.jcc.am.zn.executeBatch(zn.java:2837) at org.npci.ThreadClass.run(ThreadClass.java:63) at java.lang.Thread.run(Thread.java:748)

下面是批量大小为 50-100 条记录时执行的代码:

String queryToUpdate = "UPDATE INST1.ENCRYPT_REF SET ENCR_NUM=? WHERE ID=?";
PreparedStatement pstmtForUpdate = conn.prepareStatement(queryToUpdate);
for (Map.Entry<Long,String> entry : encryptMap.entrySet()) {
pstmtForUpdate.setString(1, entry.getValue());
pstmtForUpdate.setLong(2, entry.getKey());
pstmtForUpdate.addBatch();
}
pstmtForUpdate.executeBatch();
conn.close();

最佳答案

如果不了解数据库结构,就很难推荐特定的解决方案。如果您可以更改数据库,一个好的策略是对表进行分区,然后安排每个线程更新单独的分区。您可以有效地让每个线程分别更新自己的较小数据库,而不是让多个线程更新一个大型数据库并相互冲突。

您还应该确保有效地批量更新并且不要过于频繁地提交。

如果您的表有大量索引,则在更新后删除部分/全部索引并重建可能比持续更新更有效。同样,您可能会考虑删除触发器、引用完整性约束等,然后再进行修补。

关于java - 使用 Hibernate 和多线程批量更新 DB2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com