2013-03-20 60 views
0

我是java新手。我正在嘗試創建程序在不同的線程中向ResultSet拋出值。resultset上的Java線程oracle

 ResultSet rset = stmt 
      .executeQuery("select DISTINCT substr(file_type,1,3) from DBM.file_table where process_time= '0015' "); 

while (rset.next()){  
    r = rset.getString(1); 
System.out.println(r); 

現在假設我們從ResultSet中得到5個不同的值。我想要做的是在不同線程中同步運行的ResultSet的所有值的代碼下面運行。

String spCall = "call DBM.SP_MS_" + r + "('0015', NULL, SYSDATE, 'DBM')"; 

    try { 
     dbConnection = getDBConnection(); 
     stmt1 = dbConnection.createStatement(); 

     System.out.println(spCall); 

     stmt1.executeUpdate(spCall); 

     System.out.println("SUCCESS for File_Type " + r); 
     System.out.println("-----------------------------"); 
    } catch (SQLException e) { 

     System.out.println(spCall); 

     stmt1.executeUpdate(spCall); 

     System.out.println("SUCCESS for File_Type " + r); 
     System.out.println("-----------------------------"); 
    } catch (SQLException e) { 

感謝

+0

爲什麼不使用[Thread](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html)? – Kai 2013-03-20 16:03:23

回答

1

您可以進行如下操作:

public void executeQuery() 
{ 
    ResultSet rset = stmt.executeQuery("select DISTINCT substr(file_type,1,3) from DBM.file_table where process_time= '0015' "); 

    while (rset.next()) 
    {  
     final r = rset.getString(1); 
     System.out.println(r); 
     Thread th = new Thread (new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       method(r); 
      } 
     }); 
     th.start(); 
    } 
} 
public synchronized void method(String r) 
{ 
    String spCall = "call DBM.SP_MS_" + r + "('0015', NULL, SYSDATE, 'DBM')"; 

    try { 
     dbConnection = getDBConnection(); 
     stmt1 = dbConnection.createStatement(); 

     System.out.println(spCall); 

     stmt1.executeUpdate(spCall); 

     System.out.println("SUCCESS for File_Type " + r); 
     System.out.println("-----------------------------"); 
    } catch (SQLException e) { 

     System.out.println(spCall); 

     stmt1.executeUpdate(spCall); 

     System.out.println("SUCCESS for File_Type " + r); 
     System.out.println("-----------------------------"); 
    } catch (SQLException e) {} 
} 
+0

謝謝你......這對我有用...... :) – Seth 2013-03-20 17:34:06

-1

Java Concurrency Tutorial是一個偉大的地方開始尋找需要解決這個問題的所有信息(注意,這個教程很容易從有關谷歌搜索找到)。

0

你確定你是在正確的方向前進?你已經在使用存儲過程了,爲什麼沒有存儲過程完成所有的工作?在這一點上它應該是數據庫中的單個呼叫:

CALL DBM.SP_MS('0015', NULL, SYSDATE, 'DBM'); 

內部的Oracle存儲過程,那麼你會做什麼,實際上由_ + r版本單獨完成;無論如何它都會收到與原始通話一樣的'0015'。這將簡化你的Java方面,並且它會對數據庫造成更小的連接負擔(而不是來回移動)。

存儲過程然後可以返回它影響的文件類型的列表(r),您可以將它用於日誌記錄或報告目的。

這在內部是如何工作的取決於_ + r實際上在做什麼。我會懷疑它是一樣的。

最後,這樣做意味着,如果您確實想要Thread停止通話,那麼您只需要爲總體調用創建一個Thread即可。這導致系統中的Thread更少,這通常是件好事。

此外,由於您是Java新手,請查看Executor s和jtahlborn的鏈接。