2017-08-25 10 views
0

私はArrayListを管理し、各項目をpreparedStatementを使ってmySQLに送るコードを持っていますが、このコードの速度を上げる方法はわかりません。私は.addBatch()を使ってみましたが、うまくいきませんでした。ここにコードがあります。大きなデータをmysql(JDBC)に素早く転送するには?

try { 
      connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); 
      preparetStmt = connection.prepareStatement(INSERT_NEW); 
      for (int i = 0; i < priceItems.size(); i++) { 
       preparetStmt.setString(1, priceItems.get(i).getName()); 
       preparetStmt.setString(2, priceItems.get(i).getQuantity()); 
       preparetStmt.setString(3, priceItems.get(i).getCost()); 
       preparetStmt.setString(4, priceItems.get(i).getAnnotation()); 
       preparetStmt.addBatch(); 
      } 
      preparetStmt.executeBatch(); 


      if (!connection.isClosed()) { 

       System.out.print("DB is closed."); 

      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

この文を読み込む速度を向上させる方法を見つけるお手伝いをしてください。 1500アイテムの場合は2分以上かかっています。150Kアイテム以上を送信する必要があります。このコードを改善する方法の

+1

JDBCを使用する必要がありますか、データベースサーバーに直接アクセスしていますか? csvのようなファイルをお持ちの場合は、データベースにバッチを挿入するほうがずっと速くなります – Noob

+0

addBatch()のドキュメントを確認してください。あなたのやり方は間違っています。チェックアウトできるWeb上にバッチングチュートリアルがあります。この種の問題を解決するには、既知の作業から未知の作業へのバックアップと開始が必要です。それで、あなたを助ける人を手に入れるのは難しいでしょう。 – jdv

+0

また、これが1回限りの操作であるのか、これが通常の通常のデータセットの動きであるのかを明確にする必要があります。これはスキーマ、インデックスなどに影響を与えます。 – jdv

答えて

1

ロット:

  1. あなたはネットワークの遅延を削減するように、小さいバッチを作成します。
  2. トランザクションマネージャを使用し、バッチをコミットします。ロールバックセグメントは、トランザクション全体と同じ大きさであってはなりません。
  3. リソースをfinallyブロックで閉じます。
関連する問題