2016-11-25 12 views
1

こんにちは、MYSQL DBのテーブルの1つから50K +の行をフェッチしようとしています。すべてのデータを取得してテキストファイルに書き込むのに20分以上かかる。このフェッチ時間を短縮し、コードをより効率的にするためにマルチスレッドを使用できますか?どんな助けもありがとう。マルチスレッドを使用してmysqlでデータをフェッチする方法

通常のJDBC接続とResultSetMetaDataを使用して、テーブルから行をフェッチしています。

String row = ""; 
    stmt = conn.createStatement(); 
    ResultSet rs = stmt.executeQuery("select * from employee_details"); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    int columnCount = rsmd.getColumnCount(); 
while (rs.next()) { 
     for (int i = 1; i < columnCount; i++) { 
      row = row + rs.getObject(i) + "|";// check 
     } 
     row = row + "\r\n"; 
    } 

私は以下のようにテキストファイルに値を書き出しています。

BufferedWriter writer = new BufferedWriter(new FileWriter(
    "C:/Users/430398/Desktop/file/abcd.txt")); 
    writer.write(row); 
    writer.close(); 
+1

私はマルチスレッドがこれをまったくスピードアップするとは思わない。ボトルネックはどこに何があるのでしょうか?スレッドに影響を与えますか? –

+0

しかし、それを試して何が起こっているのを見ても害はありません - これであなたの実験で何を見つけましたか? –

+0

私は単純なJDBC接続とresultmetadataを使って値を取得しようとしました。それは20分かかります。私はマルチスレッドがここで動作するかどうかは分かりません –

答えて

0

まず、ボトルネックの原因を特定する必要があります。 SQLクエリですか?または、ResultSet経由で行を取得していますか?または巨大な弦の建物ですか?ファイルを書いているのでしょうか?

上記のアルゴリズムの各部分の継続時間を測定し、結果を教えてください。この知識がなければ、アルゴリズムをどのように高速化するかは分かりません。

+0

ResultSetを使用してデータを取得することは、ファイルに書き込むよりも時間がかかります。私はフェッチ時間を短縮するためにSQLでバッチ(OFFSETを使用)を使用することを考えています。 –

+0

巨大な文字列を作成せずに取り出しを試しましたか? – Michal

+0

問題は巨大なStringの構築にありました。私はStringBuilderを使用し、データは2秒以内にフェッチされます。 –

1

rs.nextは、DBから結果をnバッチで取得することに注意してください。 nはJDBC実装によって定義された番号です。今は10時だと思う。したがって、10バッチごとにDBに再度クエリが行われるため、同じマシン上にあってもネットワークオーバーヘッドが発生します。

この数字を増やすだけで、読み込み時間が短縮されます。

編集: これを追加すると stmt.setFetchSize(50000); となる場合があります。

これは、メモリ消費量が大きくなることに注意してください。

+0

私はstmt.setFetchSize(50000)を追加しようとしました。依然としてデータを取得するのに19分かかりました。 –

+0

@BasheerAhmed:それは20分以上です。 –

+0

@HovercraftFullOfEels混乱して申し訳ありません。 20分以上は21分45秒であった。 –

関連する問題