2017-07-03 36 views
-3

従業員と呼ばれる10,000レコードのテーブルがあります。テーブルデータをJavaの複数のCSVファイルに書き込む

これらのデータを、マルチスレッドJavaを使用して、それぞれ2,000レコードの複数のCSVファイルに書き込む必要があります。

サンプル・コードは以下の通りです:

public class PrintbyThreads { 

    public static void main(String[] args) { 
     ExecutorService executor = Executors.newFixedThreadPool(5); 
     for (int i = 0; i < 5; i++) { 
      Runnable worker = new PrintFiles("" + i); 
      executor.execute(worker); 
      } 
     executor.shutdown(); 
     while (!executor.isTerminated()) { 
     } 
     System.out.println("Finished all threads"); 
    } 
} 

public class PrintFiles extends Thread implements Runnable { 
    private String command; 

    PrintFiles() { 
     super("my extending thread"); 
     System.out.println("my thread created" + this); 
     start(); 
    } 

    public PrintFiles(String command) { 
     this.command = command; 
    } 

    public void run() { 
     System.out.println(Thread.currentThread().getName() 
       + " Start. Command = " + command); 
     dataBaseExecution(); 
     System.out.println(Thread.currentThread().getName() + " End. Command =" 
       + command); 
    } 

    public synchronized void dataBaseExecution() { 
     String tableName = "Employee"; 
     String filename = "D:/db2csv/"; 
     int recordsAtTime = 2000; 
     try { 
      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      Connection con = DriverManager.getConnection(
        "URL", "Uname", "Password"); 
      Statement stmt = con.createStatement(); 
      stmt.setFetchSize(recordsAtTime); 
      ResultSet rs = stmt.executeQuery("select empid,empname,managerid from Employee"); 
      int columnCount = rs.getMetaData().getColumnCount(); 
      FileWriter fw = new FileWriter(filename + "" + tableName + ".csv"); 
      for (int i = 1; i <= columnCount; i++) { 
       fw.append(rs.getMetaData().getColumnName(i)); 
       fw.append(","); 

      } 
      fw.append(System.getProperty("line.separator")); 
      while (rs.next()) { 
       for (int i = 1; i <= columnCount; i++) { 
        if (rs.getObject(i) != null) { 
         String data = rs.getObject(i).toString(); 
         fw.append(data); 
         fw.append(","); 
        } else { 
         String data = "null"; 
         fw.append(data); 
         fw.append(","); 
        } 

       } 
       // new line entered after each row 
       fw.append(System.getProperty("line.separator")); 
      } 

      fw.flush(); 
      fw.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String toString() { 
     return this.command; 
    } 
} 

私のコードは、私は5つのCSVファイルは各2000件のレコードを持つ必要があるすべての10000 records.butを有する単一のCSVファイルを与えています。

スレッド1は

スレッド2のETC employee2.csv

,,,,,に別の2000件のレコードを処理しなければならないemployee1.csvに最初の2000件のレコードを処理しなければなりません。

スレッドコードを使用すると、どのようにこの要件を達成できますか?

+2

ご覧くださいhttps://meta.stackoverflow.com/questions/284236/why-is-can-someone-help-me-not-an-actual-question ...あなたの質問はあまりにも広すぎます。 「私のために私の仕事をしてください」のように読む – GhostCat

+0

申し訳ありません。私にもプログラムがあります。しかし、何らかのセキュリティ上の理由から、ここではコードを書いていません。私は完全なコードは必要ありません。 2000レコードが届くともう1つのCSVファイルを作成するロジックはほとんどありません。 –

+0

* production *コードを記述する必要があるとは誰も言いません。 [mcve]を入れよう!それ以外の場合は、** nothing **を受け取りますが、ダウンボートとクローズリクエストを受け取ります。 – GhostCat

答えて

0

コードでは、インデックスを取得し、スレッドの処理に必要なインデックスを付けるパーティショナーが必要な場合があります。

パブリッククラスMyPartitioner {

public Map partition(int gridSize,int range) { 

    Map partitionMap = new HashMap(); 
    int startingIndex = 0; 
    int endingIndex = range; 

    for(int i=0; i< gridSize; i++){ 
     Map threadMap = new HashMap(); 

     threadMap.putInt("startingIndex",startingIndex); 
     threadMap.putInt("endingIndex", endingIndex); 

     startingIndex = endingIndex+1; 
     endingIndex += range; 

     partitionMap.put("Thread:-"+i, threadMap); 
    } 

    return partitionMap; 
} 

}

キュータフレームワークは、割り当てられた行ない全ての行を処理するワーカースレッドのインデックスから、インデックスにこれを使用します。フィルタ条件での選択クエリの使用中

where id >= :fromId and id <= :toId 
関連する問題