2016-04-13 12 views
0

私はexecuteBatchを使用してデータを挿入しましたが、データが失われたり、データベースに見つかりませんでしたり、例外が見つかりませんでした。
DB:Oracle。
ドライバのバージョン:11.2.0.4.0
プール:UCP:Oracle Universal Connection Pool
Pls help。addBatchを使用するとデータが失われる

ここに私のコード:

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

multilogにはアイテムのすべての書き込みステートメントが含まれていますか? – eis

+0

Multilogはlog4jなので、私が尋ねたものではない、 –

+1

という改善があります。ログにはすべてのバッチエントリが含まれていますか? – eis

答えて

0

あなたがチェックしたいかもしれませんただ、もう一つ:調べint[]executeBatchによって返されました。これを今確かめることはできませんが、以前のバージョン(〜10y)でexecuteBatchという古いOracle JDBCドライバ(使用しているバージョン)の予期しない動作が発生したと思います。いくつかのステートメントが失敗したにもかかわらず、例外をスローしないかも配列EXECUTE_FAILED/SUCCESS_NO_INFOのエントリをスキャンします(リンクされたJavaDocを参照)。

(私が覚えていれば、ただ1つのバッチステートメントが失敗した場合、つまり、バッチステートメントのどれが失敗したかを知ることさえできない場合でも、すべてEXECUTE_FAILEDの配列を取得することさえあります。単一の失敗したものをソートするためにバッチをロールバックして分割する必要があります(適切な例外とエラーメッセージが得られるように非バッチを実行します)。確かに、これは、 )

関連する問題