2016-04-13 12 views
0

ここでは2つのスレッドを作成しました。それらのレコードをコンソールに送ります。各スレッドに一定量のrdmsレコードを割り当てる方法

それぞれ10個のレコードを含む2つのバッチがあるとします。これらのレコードをコンソールに書き込むために各スレッドに各バッチを割り当てようとしています。

ここでは、スレッド1だけが1000レコード(1バッチあたり10レコード)を読み込んでいますが、スレッド2を作成します。スレッド2を作成すると、並列処理が可能になります。

マイコード:

public class DataRead { 

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/test"; 

    static final String USER ="root"; 
    static final String PASS ="abc"; 

    public static void main(String[] args) throws ClassNotFoundException, SQLException { 
     Connection conn = null; 
     Statement stmt = null; 

     Class.forName(JDBC_DRIVER); 

     System.out.println("Connecting to a selected database"); 
     conn = DriverManager.getConnection(DB_URL, USER,PASS); 
     System.out.println("Connected to Database Successfully !!!"); 

     ResultSet rs = null; 

     stmt = conn.createStatement(); 
     int maxRecords = 10; 
     int initialcount =0; 
     int count =0; 
     rs = stmt.executeQuery("SELECT COUNT(*) FROM customer"); 
     rs.next(); 
     count = rs.getInt(1); 
     System.out.println(count); 

     for(int i=0;i<count/10;i++){ 

       String sql =" SELECT customerId,firstName,lastName FROM customer ORDER BY customerId LIMIT "+initialcount+","+maxRecords; 

       rs = stmt.executeQuery(sql); 

       String CustID= null; 
       String firstName = null; 
       String lastName = null; 


       ExecutorService threadExecutor = Executors.newFixedThreadPool(2); 
       List<CustomerData> list = new ArrayList<CustomerData>(); 

       while(rs.next()){ 

        CustomerData customer = new CustomerData(); 
        customer.setCustID(rs.getString("customerId")); 
        customer.setFirstName(rs.getString("firstName")); 
        customer.setLastName(rs.getString("lastName")); 

        list.add(customer); 

       } 
       MyRunnable task1 = new MyRunnable(list); 
        threadExecutor.execute(task1); 


       threadExecutor.shutdown(); 
       while(!threadExecutor.isTerminated()){ 
        try { 
         threadExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
         } catch (InterruptedException e) { 

         } 
       } 

       initialcount = initialcount + maxRecords; 
     } 

    System.out.println("Finished all threads !!!"); 
    } 

} 

MyRunnable:

public class MyRunnable implements Runnable{ 

    private final List list; 

    public MyRunnable(List list){ 
     this.list = list; 
    } 

    @Override 
    public void run() { 
     for(int i=0;i<list.size();i++){ 
      CustomerData cust = (CustomerData) list.get(i); 
      System.out.println(Thread.currentThread().getName()+" "+"Hello: "+cust.getCustID()+" "+cust.getFirstName()+" "+cust.getLastName()); 
     } 


    } 

} 

CustomerData:私は頻繁に従うために使用

public class CustomerData { 

     private String custID; 
     private String firstName; 
     private String lastName; 

    public String getCustID() { 
     return custID; 
    } 
    public void setCustID(String custID) { 
     this.custID = custID; 
    } 
    public String getFirstName() { 
     return firstName; 
    } 
    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 
    public String getLastName() { 
     return lastName; 
    } 
    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

答えて

1

一つの迅速な解決、

は内部を持っています。それにバッチをエンキューします。 Foreachスレッドは値(内部キューからバッチ)をデキューして割り当てます。

NOT完全なソリューション

ステップ1:

Queue<List<CustomerData>> queue = new ConcurrentLinkedQueue<ArrayList<CustomerData>>(); 

ステップ2:foreachの選択された項目は、オブジェクトのバッチ(10言う)を作成

ArrayList<CustomerData> listofobjects = // insert batch of vales selected from DB 

STEP3:

queue.add(listofobjects); // add your batches into concurrent queue 

ステップ4:

while(queue.isEmpty()){ 
    ArrayList<CustomerData> batch = queue.poll(); 
    // Pass batch to Thread and print it. 
} 
+0

uはここ – dev777

+0

dev777 @上でコードを編集してくださいすることができ、ここでは簡単な擬似です。お試しください – Backtrack

+0

ありがとうございます。私はそれを試してみます – dev777

関連する問題