1

約1000行を含むファイルがあります。私が実装しようとしている機能は、このファイルを取得して検証することです。検証が完了したら、データベーステーブルに行を挿入する必要があります:)

私の質問は次のとおりです: for ループで挿入を行うと、パフォーマンスに大きな問題が生じますか? この for ループは、ファイルの各行で insert を呼び出します。つまり、for ループを介して行われる 1000 回の INSERT について話しているのです。このようなものを実装する最良の方法は何でしょうか? 私は明らかに間違ったことをしていますか?

4

3 に答える 3

2

これらすべての挿入をバッチ処理できます。ファイルを読みながら、インサートを作成してから、次のように実行します。

Statement st = con.createStatement();
st.addBatch("INSERT INTO xx VALUES(...)");
st.addBatch("INSERT INTO xx VALUES(...)")
st.executeBatch();

この手法を使用すると、大きな入力を効率的に処理できます。

于 2012-12-11T20:13:23.373 に答える
2

通常はこれで問題ありません。トランザクションを開始し、各行を一度に挿入して、トランザクションを閉じます。それだ。1000行でも問題ありません。

一方、1,000,000 行でこれを行おうとすると、問題が発生する可能性が高いため、それぞれ 1000 行の 1000 トランザクションのパケットで実行する必要があります。

何らかの理由でトランザクションの 1000 行が多すぎる場合は、200、100、または 50 のパケットで実行します。

于 2012-12-11T20:13:43.433 に答える
2

基本的に、ループで 1000 回の挿入を行うことに問題はありません。1000 行の場合、おそらく大きな違いはありませんが、本当に最高のパフォーマンスを得たい場合は、PreparedStatement を使用して挿入をバッチ処理する必要があります。

PreparedStatement  pstmt = con.prepareStatement("insert into the_table (col1, col2) values (?,?)");
for (row=0; row < rowCount; row ++) {
  // obtain the values for each row
  pstmt.setInt(1, some_value);
  pstmt.setString(2, other_value);
  pstmt.addBatch();
}
pstmt.executeBatch();
con.commit();

より多くの行が予想される場合は、1000 行ごとに executeBatch() を呼び出すことをお勧めします。これは、呼び出すaddBatch()まですべてのデータ ( で設定) がメモリに保持されるためです。executeBatch()

于 2012-12-11T20:16:02.103 に答える