我正在使用oracle 11g db。 使用准备好的语句我正在进行批量更新,代码如下:
private void couponManualBatchBoxExecutePreparedStatement(List<Box> boxList, Long PartnerAccountId, Long cpnBatchId) throws Exception {
String url = new COREResourceProperties().getValue("DATABASE_URL");
Connection conn = DriverManager.getConnection(url, "ABC", "ABC");
conn.setAutoCommit(false); //keep auto commit false for better performance
//query for inserting batch data
String boxquery = "UPDATE PACKING_SERIAL SET CPNB_ID = ?, DLUO = ?, PACK_TYPE = 'B', CONTAINER_SERIAL = null WHERE SERIAL = ? AND PARTNER_ID = ?";
String packquery = "UPDATE PACKING_SERIAL SET CPNB_ID = ?, DLUO = ?, PACK_TYPE = 'P', CONTAINER_SERIAL = ? WHERE SERIAL = ? AND PARTNER_ID = ?";
PreparedStatement pBoxPackingSerialStatement = conn.prepareStatement(boxquery);
PreparedStatement pPackPackingSerialStatement = conn.prepareStatement(packquery);
List<String> boxSerialList = new ArrayList();
int batchSize = 990;
int recordSize = 1;
for (Box box : boxList) {
boxSerialList.add(box.getBoxSerial().toUpperCase());
for (Pack pack : box.getPackList()) {
if (batchSize >= recordSize) {
Date CurrentTime = new SimpleDateFormat("E MMM d HH:mm:ss z yyyy").parse((new Date()).toString());
Calendar c = Calendar.getInstance();
c.setTime(CurrentTime);
java.sql.Timestamp timestamp = new java.sql.Timestamp(c.getTimeInMillis());
pPackPackingSerialStatement.setLong(1, cpnBatchId);
pPackPackingSerialStatement.setTimestamp(2, timestamp);
pPackPackingSerialStatement.setString(3, box.getBoxSerial().toUpperCase());
pPackPackingSerialStatement.setString(4, pack.getPackSerial());
pPackPackingSerialStatement.setLong(5, PartnerAccountId);
pPackPackingSerialStatement.addBatch();
} else {
Date CurrentTime = new SimpleDateFormat("E MMM d HH:mm:ss z yyyy").parse((new Date()).toString());
Calendar c = Calendar.getInstance();
c.setTime(CurrentTime);
java.sql.Timestamp timestamp = new java.sql.Timestamp(c.getTimeInMillis());
pPackPackingSerialStatement.setLong(1, cpnBatchId);
pPackPackingSerialStatement.setTimestamp(2, timestamp);
pPackPackingSerialStatement.setString(3, box.getBoxSerial().toUpperCase());
pPackPackingSerialStatement.setString(4, pack.getPackSerial());
pPackPackingSerialStatement.setLong(5, PartnerAccountId);
pPackPackingSerialStatement.addBatch();
pPackPackingSerialStatement.executeBatch();
recordSize = 0;
}
recordSize++;
}
}
for (String boxSerial : boxSerialList) {
Date CurrentTime = new SimpleDateFormat("E MMM d HH:mm:ss z yyyy").parse((new Date()).toString());
Calendar c = Calendar.getInstance();
c.setTime(CurrentTime);
java.sql.Timestamp timestamp = new java.sql.Timestamp(c.getTimeInMillis());
pBoxPackingSerialStatement.setLong(1, cpnBatchId);
pBoxPackingSerialStatement.setTimestamp(2, timestamp);
pBoxPackingSerialStatement.setString(3, boxSerial);
pBoxPackingSerialStatement.setLong(4, PartnerAccountId);
pBoxPackingSerialStatement.addBatch();
}
pBoxPackingSerialStatement.executeBatch();
pPackPackingSerialStatement.executeBatch();
conn.commit();
pBoxPackingSerialStatement.close();
pPackPackingSerialStatement.close();
conn.close();
}
此代码导致数据库锁定,oracle中的v $ session事件给出'enq:TX - 行锁争用'。 该程序挂起在pBoxPackingSerialStatement.executeBatch();