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

标签 java hibernate exception db2

我需要更新 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/

相关文章:

java - Android 9 Api 28 通知未显示

java - 在文档中显示方法体的一部分

java - 创建数据库脚本mySQL

java - Postgres 中的生成值

c# - 为什么我的应用程序在出现未处理的异常后不会停止?

Java代码不发布证书

java - 如何打印四部分碎片列表中的数组列表?

JavaFX 桌面应用程序 - 使用 HSQLDB(嵌入式)和 Hibernate

java - 如何不抛出一般指定的异常?

Python - Selenium 错误的 url 或服务器无法访问