2016-10-09 85 views
0

テキストファイルから数千行のデータをデータベースに読み込むJavaプログラムがあります。文のバッチ処理を使用して、一度に数千の行を挿入します。BatchUpdateExceptionから行ごとに実行失敗の原因を特定します。

行が更新に失敗した場合は、リストの最後まで残りの行を試し続けます。その後、私は戻って、どの行が失敗したかをチェックし、後でチェックするために、これらの行の情報をログファイルに出力します。

重複したエントリのために失敗した場合は、失敗した行をスキップする方法があるのだろうかと思います。私は重複が失敗しても問題ないですが、他の理由で挿入が失敗した場合は、ログファイルに出力する必要があります。

私は現在、これを行う方法がある:代わりにupdateCountsがEXECUTE_FAILEDされるすべての行を印刷する

int[] updateCounts; 

try { 
    // Do my batch updates by iterating through a vector of data 
} catch (BatchUpdateException buE) { 
    updateCounts = buE.getUpdateCounts(); 
} 

for (int c = 0; c < updateCounts.length; ++c) { 
    if (updateCounts[c] == Statement.EXECUTE_FAILED) { 
     // Print data from the original data vector at index c 
    } 
} 

、私は唯一の理由は、一意のキーでないものを印刷したいです。

Google、StackOverflow、BatchUpdateExceptionのドキュメントの間に、私はこれを行う方法がないと思っています。しかし、それがあればそれはいいだろうと私はそれを見つけることができませんでした。

答えて

0

2つの理由が考えられます。

  1. SQLクエリに構文ミスがある可能性があります。
  2. プライマリキーのエントリが重複している可能性があります。

テキストファイルからデータを読み込んでいるので、Load Data Local InFile SQLでのクエリを使用することをお勧めします。これにより、上記の問題の両方が解決され、すべての正規のエントリがデータベースにアップロードされます。

これが役に立たない場合は、質問に質問を追加すると、スタックトレースが役立ちます。

+0

多分私は質問ではっきりしませんでした:今はプログラムが機能していますが、私が望む以上にロギングしています。 今のところ、私はすべての失敗行を記録しています。重複しているために失敗したものはどれか分かります。 しかし、唯一の理由は、構文エラーです。 1つの行に構文エラーがある可能性は非常に低いので、失敗した行のロギングを安全に停止し、それらがすべて重複していると想定できると思います。 – user1538516

+0

スタックトレースをここに追加できますか? –

+0

スタックトレースがどのように役立つかわかりません... BatchUpdateExceptionですが、どのラインから来るのか分かります。 BatchUpdateExceptionのgetMessage()メソッドは、一意のキーのために乱暴な行を示しますが、そのメッセージは1つの(私は最後のものと思われます)失敗にのみ適用されます。 – user1538516

関連する問題