2016-04-13 2 views
0

Я использую executeBatch для вставки данных, но некоторые данные потеряны, не могут быть найдены в базе данных, не найдено никаких исключений.
DB: Oracle.
Версия для драйверов: 11.2.0.4.0
Пул: UCP: Oracle Universal Connection Pool
Помощь Pls.Утерянные данные при использовании addBatch java

Вот мой код:

protected static void insertExtraData(String serviceCode, JsonObject extras, PaymentRequest request) { 
    PreparedStatement ps = null; 
    long tid = request.getTransId(); 
    long coreId = request.getCoreTransId(); 
    Connection con = null; 
    try { 
     con = ConnectionFactory.getConnection(); 
     con.setAutoCommit(false); 
     ps = con.prepareStatement("INSERT INTO REPORT_ADMIN.SHOPPING_TRANS_DATA VALUES(?,?,?)"); 
     MultiLog.write(serviceCode, tid, coreId, "INSERT INTO REPORT_ADMIN.SHOPPING_TRANS_DATA VALUES(?,?,?)"); 
     Set<String> fieldNames = extras.getFieldNames(); 
     for (String fieldName : fieldNames) { 
      MultiLog.write(serviceCode, tid, coreId, "para 01: " + tid); 
      MultiLog.write(serviceCode, tid, coreId, "para 02: " + fieldName); 
      MultiLog.write(serviceCode, tid, coreId, "para 03: " + extras.getString(fieldName)); 
      ps.setString(1, String.valueOf(tid)); 
      ps.setString(2, Utils.nullToEmpty(fieldName)); 
      ps.setString(3, Utils.nullToEmpty(extras.getString(fieldName))); 
      MultiLog.write(serviceCode, tid, coreId, "add Batch"); 
      ps.addBatch(); 
     } 
     ps.executeBatch(); 
     con.commit(); 
    } 
    catch (Exception e) { 
     MultiLog.error(serviceCode, tid, "ERROR", e); 

    } 
    finally { 
     Utils.close(ps); 
     Utils.close(con); 
    } 
} 

Вот мой журнал:

 
    [[1460430555111][698905167]]---INSERT INTO REPORT_ADMIN.SHOPPING_TRANS_DATA VALUES(?,?,?) 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: TransId_Ref 
    [[1460430555111][698905167]]---para 03: 1460430539304 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: ContractNo 
    [[1460430555111][698905167]]---para 03: 207-0003 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: IdCardNumber 
    [[1460430555111][698905167]]---para 03: ***9272 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: CustomerName 
    [[1460430555111][698905167]]---para 03: pa 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: CompanyName 
    [[1460430555111][698905167]]---para 03: FC 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: RefNo 
    [[1460430555111][698905167]]---para 03: MS1460430555111 
    [[1460430555111][698905167]]---add Batch 
    [[1460430555111][698905167]]---para 01: 1460430555111 
    [[1460430555111][698905167]]---para 02: IdentifyInfo 
    [[1460430555111][698905167]]---para 03: TE_at 
    [[1460430555111][698905167]]---add Batch 

Описание таблицы:

 
    CREATE TABLE "REPORT_ADMIN"."SHOPPING_TRANS_DATA" 
    ( 
    "TID" NUMBER NOT NULL ENABLE, 
    "KEY" VARCHAR2(50 BYTE), 
    "VALUE" VARCHAR2(500 BYTE), 
    ) SEGMENT CREATION IMMEDIATE 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 

+0

так что ваш многоязычный список содержит все записи для записей? – eis

+0

Multilog - это только log4j с некоторым улучшением, –

+1

Это не то, что я спросил. Включает ли журнал все ваши партийные записи? – eis

ответ

0

Просто еще одна вещь, которую вы можете проверить: Проверьте int[] возвращается executeBatch. Хотя я не могу проверить это сейчас, я думаю, что я испытал неожиданное поведение какого-то старого драйвера JDBC Oracle (какую версию вы используете?) С executeBatch в прошлом (~ 10y). Это может не вызвать каких-либо исключений, хотя некоторые заявления не удались. Сканирование массива на EXECUTE_FAILED/SUCCESS_NO_INFO записей (см. Связанный JavaDoc).

(Если я правильно помню, вы могли бы даже получить массив из всех EXECUTE_FAILED, если только один пакетный оператор не сработал, т. Е. Вы даже не можете получить подсказки о том, какие из операторов пакета не выполнялись и которые работали. придется откатывать и разбивать партии для сортировки одиночных неудачных (и выполнять их без пакета, чтобы вы получили правильное исключение и сообщение об ошибке). По общему признанию, это слишком сложно для умеренного количества данных, наборы.)

Смежные вопросы