2011-06-27 6 views
0

私はヘッダーとデータでExcelファイルを読み込み、ファイルから抽出されたヘッダーとput値に基づいてデータベース(MySQL)にテーブルを作成するという要件を持っています。そのために、DB表にデータを作成して挿入するためにJDBCを使用しています。javaを使用してデータを挿入する処理速度を最適化する方法は?

これはうまく動作しますが、レコード数が増えると、ファイルに200000以上のレコードが含まれていると、処理が遅くなります。 DBテーブルにデータを挿入する処理速度を最適化する方法を教えてください。

おかげで、Sameek

+0

メインフレームを使用してOracle DBに変更します。 –

+0

..私は、単一のExcelテーブルは65535レコード(行)以上を保持することはできませんと思った –

+0

@Andreas_D:確かに。私は彼が各Excel行または何かのために複数の行を挿入していると思います...(または多分彼は複数のシートを使用しています) – helios

答えて

6

は、あなたが最初のインサートの全てで同じPreparedStatementオブジェクトを使用する必要があり、それを最適化します。

コードをさらに最適化するため、バッチ更新を送信できます。

バッチの5:

//create table 
PreparedStatement ps = conn.prepareStatement(sql); 
for(int i =0; i < rows.length; ++i) { 
    if(i != 0 && i%5 == 0) { 
    pstmt.executeBatch(); 
    } 
    pstmt.setString(1, rows[i].getName()); 
    pstmt.setLong(2, rows[i].getId()); 
    pstmt.addBatch(); 
} 
pstmt.executeBatch(); 
+0

+1 - 私は、人々が時々忘れるということを学びました。何度も何度も(再)使用するためのステートメントを準備しています。 –

1

トランザクションで挿入をラップします。擬似コード:

1)開始トランザクション 2)を作成し、準備されたステートメント 3)すべての挿入のためのループ、 4を挿入し、準備されたステートメントのパラメータを設定し、それぞれの実行)コミットトランザクション

0

私はの例を取りますよ休止状態。 Hibernateには、まだDBに送られていないSQLコマンドを格納するHibernateSessionという概念があります。 Hibernateでは、100回の挿入ごとにセッションを挿入してフラッシュできます。つまり、100回の挿入ごとにSQLクエリを送信します。これにより、100個の挿入ごとにデータベースと通信するため、挿入が不要なため、パフォーマンスが向上します。

したがって、executeUpdateを100回(何時でも何回でも)実行するか、preparedStatementを使用して同じことを行うことができます。

関連する問題