JDBC批量更新锁定表并且不响应700万条记录



我们在通过JDBC批更新更新表记录时遇到了一个问题。调用excecuteBatch()方法时,表被锁定,执行被卡住。此表包含700万条记录。扫描表格需要更多时间。请告知解决此问题的最佳做法。PRODUCT_CODE是表的主要约束

PreparedStatement ps = null;
FacadeCommonManagerBean facadeCommonManagerBean = new FacadeCommonManagerBean();
String sqlQuery = "UPDATE TABLENAME SET SBU_CODE=?,......... WHERE PRODUCT_CODE=? "; 
try (Connection connection = dataSource.getConnection()) {
ps = connection.prepareStatement(sqlQuery);
final int batchSize = 5000;
int count = 0;
if (productCol != null)
for (ProductValue productValue : productCol) {
ps.setString(1, productValue.getSbuCode());     
ps.setString(2, productValue.getProdLineId());
............................................
.........................................
}
......................................
ps.addBatch();

if (++count % batchSize == 0) {

try {
ps.executeBatch();
} catch (SQLException e) {
log.error(ERROR_STRING_ONE, e);
}

}
}
}
try {
ps.executeBatch(); // insert remaining records

} catch (SQLException e) {
log.error(ERROR_STRING_ONE, e);
}
  1. 你用测试过这些东西吗

    • 较小批量(1005001000(
    • 行数较少的类似表(20000(
  2. 请注意,网络包的大小在前几天为32k因此,当一个批次包含超过32k时,你可能会陷入困境-你可以通过网络跟踪来检查这一点,因为瘦驱动程序不使用Oracle网络,您需要使用OCI厚驱动程序使用sqlnet.ora配置跟踪参数查看服务器和客户端上发生了什么。

  3. 尝试实现PLSQL过程,并将数组传递给它并执行。

最新更新