2016-08-23 18 views
0

を作成する方法 のJava-のMySQL:ストアドプロシージャ私は、MySQLを使用してJava 1.7プロジェクトの作業

IのPreparedStatementを持つテーブルに大量のデータを挿入する方法がありますが、これはメモリー不足を引き起こしますGlassFishサーバーでエラーが発生しました。

Connection c = null; 
    String query = "INSERT INTO users.infos(name,phone,email,type,title) " 
      + "VALUES (?, ?, ?, ?, ?, "; 
    PreparedStatement statement = null; 
    try { 
     c = users.getConnection(); 
     statement = c.prepareStatement(query); 
    } catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

try{ 
     int i =0; 
     for(Member member: members){ 
      i++; 
      statement.setString(1, member.getName()); 
      statement.setString(2, member.getPhone()); 
      statement.setString(3, member.getEmail()); 
      statement.setInt(4, member.getType()); 
      statement.setString(5, member.getTitle()); 
      statement.addBatch(); 
      if (i % 100000 == 0){ 
       statement.executeBatch(); 
      } 
     } 
     statement.executeBatch(); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } finally { 
     if(c != null) 
     { 
      try { 
       c.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     if(statement != null){ 
      try { 
       statement.close(); 
      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     c = null; 
     statement = null; 
    } 

は、私は、このメモリの問題を回避するために、ストアドプロシージャを作成する必要があると思いますが、私は、プロシージャまたは関数を作成する必要がある場合、私はどこから始めれば知っているとしていない、と場合は、私のことができるようになります返品などで何らかの反応を得ることができますか?

あなたはどう思いますか?

+0

など、MySQLのパラメータの一部をチューニングを見てドロップ(以降再作成)インデックスすることができますか? **トランザクション**と**小規模なバッチ**を使用する必要があります。 –

+0

より小さいバッチを試し、['try-with-resources'](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)を調べてください。 – bradimus

+1

ええ、バッチサイズ '100'または' 200'を試してみてください。 「10,000」ではない。 – Kayaman

答えて

0

プリペアドステートメントのinsertステートメントを、プリペアドステートメントのストアドプロシージャの呼び出しに置き換えても、意味のある方法でメモリ消費に影響することはありません。

非常に大きなバッチサイズを使用しているため、メモリが不足しています。さまざまなバッチサイズのパフォーマンスをテストする必要があります。バッチサイズが数十〜数百を超えると、バッチのパフォーマンスが急速に低下することがわかります。

load data infileを使用すると、入力速度を向上させることができます。多くの行のデータを取り込み、テキストファイルを作成し、ファイルをロードします。たとえば、this questionを参照してください。

並列化を検討することもできます。たとえば、複数の接続を開き、別々のスレッドで各接続に行を挿入します。同様に、load data infileを使用して並列ロードを試みることもできます。

最高のパフォーマンスが得られるかどうかを確認するには、ハードウェアの設定でさまざまな手法、バッチサイズ、スレッド数(おそらく1コアあたり1つ以上)などを試す必要があります。

ます。また、ストアドプロシージャのヘルプを作成する方法を

関連する問題