2016-12-10 24 views
-1

在java中7。while(resultset.next())平行運行

我有一個查詢。

String sql = "select path, job_id from job_table where status = 'NEW' and rownum <= 5 order by created_date"; 


ResultSet rows = null; 
try 
{ 
     conn = getConnection(); 
     preparedStatement = conn.preparedStatement(sql); 
    rows =preparedStatement.executeQuery(); 

     while(rows.next()) 
    { 

    // do stuff or call respective methods depending on the values received from resultset. 

//假設行有值1或2或3然後

if(rows.contains(1)) 
    doAnalysis1(param1); 

if(rows.contains(2)) 
    doAnalysis2(param1); 


if(rows.contains(3)) 
    doAnalysis3(param1); 

    } 
} 

現在我是做的東西平行的。以前,當我運行我的應用程序時,它實際上完成了每行的其他功能,然後處理下一行。但是,如果我得到3到4排,那麼它應該一次處理所有這些都可以實現。任何例子都可以幫助我。

+0

以前,當我跑我的應用程序實際上它完成....你能後,以前的代碼(最小)?我們需要明白你到底在做什麼,因爲我們目前的問題太廣泛了 – developer

+2

我不明白你在問什麼。 –

+0

@Tim:抱歉我最小的代碼..我只想運行我的內部,同時東西並行5記錄。 – Abb

回答

1

編輯爲Java 7:

private static final int NUM_THREADS = 8; // Can get from runtime to scale to number of cores 
private static final ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); 

String sql = "select path, job_id from job_table where status = 'NEW' and rownum <= 5 order by created_date"; 

ResultSet rows = null; 
try 
{ 
    conn = getConnection(); 
    preparedStatement = conn.preparedStatement(sql); 
    rows =preparedStatement.executeQuery(); 

    List<Future<?>> futures = new ArrayList<>(); 
    while(rows.next()) 
    { 
     // Getting values from ResultSet here, to not assume thread-safety of ResultSet 
     final String path = rows.getString("path"); 
     final int job_id = rows.getInt("job_id"); 
     futures.add(executor.submit(new Runnable() { 
      @Override 
      public void run() { 
       // do stuff or call respective methods depending on the values received from resultset. 
      } 
     }); 
    } 
    // Wait until all finished 
    for(Future<?> future : futures) future.get(); 
} 

幾個方面的考慮:

  • 您可能需要終止執行服務關閉
  • ,如果你需要得到的結果您可以使用Callable接口從你的「做東西」
  • 你將有更多的例外來處理你的try/catch。
  • NUM_THREADS可能是5你的情況?
  • run()中的任何檢查的異常都可以封裝在RuntimeException中,然後重新運行。 Callable的使用不需要這個。

編輯 - 這裏是一個不同的順序做的事情,你的數據庫連接早些時候發佈:

private static final int NUM_THREADS = 8; // Can get from runtime to scale to number of cores 
private static final ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); 

String sql = "select path, job_id from job_table where status = 'NEW' and rownum <= 5 order by created_date"; 

try { 
    List<Future<?>> futures = new ArrayList<>(); 
    try (
     Connection conn = getConnection(); 
     PreparedStatement preparedStatement = conn.preparedStatement(sql); 
     ResultSet rows = preparedStatement.executeQuery() 
    ) { 
     while(rows.next()) 
     { 
      // Getting values from ResultSet here, to not assume thread-safety of ResultSet 
      final String path = rows.getString("path"); 
      final int job_id = rows.getInt("job_id"); 
      futures.add(executor.submit(new Runnable() { 
       @Override 
       public void run() { 
        // do stuff or call respective methods depending on the values received from resultset. 
       } 
      }); 
     } 
    } 
    // Wait until all finished, database is already release while background processing is still ongoing 
    for(Future<?> future : futures) future.get(); 
} catch(...) { 
    ... 
} 
+0

我的不好。我正在使用Java 7 ..有關於此的任何事情? – Abb

+1

我已經對Java 7進行了改動。這段代碼是一種方法的指南,並不完整,我可能在這裏或那裏有一個錯字。 –

+0

不確定你在哪裏得到「param1」,你可能需要在Runnable中使用它。 –