0

一括挿入に JDBC プリペアド ステートメントを使用しています。メソッドを呼び出していps.execute()ます。失敗した場合は、パラメーターのリストと準備されたステートメントを渡すメソッドを呼び出しています。レコードを使用merge sort technique to divide the listして挿入しようとしていますが、成功しません。

これが私のコードです。

私が呼び出しているexecutePrepareStatementメソッドから

this.executeInsertStatement(query, myCollection, 0, myCollection.size());

// executeInsertStatement メソッド

public void executeInsertStatement1(String query, List myCollection, int sIndx, int eIndx) throws DBException,SQLException {

        int startIndx = sIndx, endIndx =  eIndx, mid = 0;

        try {
            try{
                if(conn.isClosed())
                    new DataService(CoreConstants.TARGET);
            } catch (Exception e) { }           
            if(startIndx >= endIndx) {
                return;
            }           
            conn.setAutoCommit(false);
            if (query != null) {
                mid = (startIndx + endIndx) / 2;
                ps = conn.prepareStatement(query);
                executeInsertStatement(query, myCollection, startIndx, mid);
                executeInsertStatement(query, myCollection, mid+1, endIndx);
                //int end_low = mid;
                //int start_high = mid + 1;
                if(mid < endIndx)
                    endIndx = mid;
                for (int i = 0; i < endIndx; i++) {
                    List list = (List) myCollection.get(i);
                    int count = 1;      
                    for (int j = 0; j < list.size(); j++) {
                        if(list.get(j) instanceof Timestamp) {
                            ps.setTimestamp(count,  (Timestamp) list.get(j));       
                        } else if(list.get(j) instanceof java.lang.Character) {
                            ps.setString(count, String.valueOf(list.get(j)));
                        }
                        else {
                            ps.setObject(count, list.get(j));
                        }
                        count++;
                    }
                    try {
                        ps.execute();   
                    } catch (Exception e) {
                        rollback();
                    }                   
                }
            }
        } catch (Exception e) {
            rollback();
        } finally{ 
            try {
                if (ps != null) {
                    ps.close();
                    ps = null;
                }
            } catch (Exception ex) {
            }
        }
    }

ありがとう

4

1 に答える 1

1

マージソートを使用して、あなたが正しい方向に進んでいるとは思いません。分割統治の概念を使用して解決策を達成しようとしていることは理解していますが、問題を実際に必要なものよりも難しくしている(そしてより混乱させている/複雑にしている)と思います。

私が正しく理解していれば、データベースに挿入したいデータセットがあります。そして、あなたはそれをまとめてやりたいと思うでしょう。addBatch()PreparedStatementでは、いくつかのきちんとしたメソッドを使用してそれを実行できます。executeBatch()

これが私があなたの要件をどのように実行しようとしたかについての概要です:

  • バッチを実行したいときに、バッチ制限、つまりバッチ内のステートメントの数を設定します。この制限(カウンターを使用して非常によく追跡できます)に達しない限り、バッチに追加し続けます

  • 制限に達したら、バッチを実行し、カウンターをリセットし、バッチをクリアして、ステップ#1をやり直します。

  • これは、データセット全体が完了するまで続きます。最後に、要件に基づいて、データをデータベースにコミットするか、ロールバックを実行することで終了します。

これを実行して実装する方法の例については、この回答をご覧ください。

于 2012-11-05T09:47:54.620 に答える