准备语句批量更新操作会导致锁定

时间:2014-12-02 12:13:55

标签: java jdbc oracle11g

我正在使用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();

0 个答案:

没有答案