2012-08-22 53 views
0

問題:您是否可以使用多個語句和記錄集,這些語句和記錄集在同一個非MULTI THREAD中使用相同的連接同時進行操作?jdbc語句連接

我只發現了這個我感興趣的問題,但答案並不一致。

JDBC Statement/PreparedStatement per connection

答案解釋記錄和陳述之間的關係,這是衆所周知的我。

鑑於這種情況,你不能有多個記錄的聲明

回答說,你可以有用於連接多個記錄。但他們沒有提到任何其他來源。


我問,如果它在第一個記錄是可能的循環,然後使用相同的連接(用於生成第一個記錄),打開另一個記錄用它在迭代循環。定義此行爲的文檔在哪裏?


我感興趣的是這樣的情況,該語句執行任務的同時INS

Connection con = Factory.getDBConn (user, pss, endpoint, etc); 
Statement stmt = con.createStatement(); 
ResultSet rs = stmt.executeQuery ("SELECT TEXT FROM dba"); 

while (rs.next()) { 
rs.getInt (.... 
rs.getInt (.... 
rs.getInt (.... 
rs.getInt (.... 

Statement stmt2 con.createStatement =(); 
ResultSet rs2 = stmt2.executeQuery ("iSelect ......"); 
while (rs2.next()) { 
.... 
rs2.close(); 
stm2.close(); 

Statement stmt3 con.createStatement =(); 
ResultSet rs3 = stmt3.executeQuery ("Insert Into table xxx ......"); 
.... 
rs3.close(); 
stm3.close(); 
} 

爲了澄清多一點:在stmt3更新的執行,你可以得到這樣的錯誤:

java.sql.SQLException:當前連接上有一個打開的結果集,必須在執行查詢之前關閉該結果集。

所以你不能在同一個連接中混合使用SQL。

+1

這裏似乎沒有問題。你到底在問什麼? –

+0

是的,沒有問號....無論如何。我問是否有可能遍歷第一個記錄集,然後使用相同的連接(用於生成第一個記錄集)打開另一個記錄集使用它並繼續迭代。定義此行爲的文檔在哪裏? – user1594895

+1

是的,這是可能的,只要你沒有試圖使用相同的語句來創建記錄集(在問題的代碼中,你不是)。 –

回答

0

如果我理解正確的話,則需要用兩個(或更多)的結果集的工作在單一方法中同時進行。

這是可能的,它運作良好。但是,你要記住幾件事情:你在每個記錄做

  • 一切都是由一個單一的Connection處理,除非你聲明的每個Statement(和ResultSet
  • 新的連接,如果你需要做的多線程過程中,我建議你爲每個線程創建Connection(或使用連接池);如果在多線程進程中使用單個連接,則程序將掛起或崩潰,因爲每個SQL語句都會經過一個連接,並且每個新語句都必須等到前一個語句完成爲止。

除此之外,您的問題需要一些澄清。你真的需要做什麼?

+0

「並且每個新語句都必須等到前一個語句結束爲止」,所以我定義的代碼無法工作,因爲語句stmt2掛起了等待語句。 – user1594895

+0

@ user1594895您編寫的代碼塊是按順序執行的,所以您的SQL指令不會同時執行......我所做的觀察僅適用於使用多線程執行任務的情況 – Barranka

+0

@ user1594895還記得關閉「ResultSet」和「 Statement'對象(當然還有''Connection'對象)當你完成它們時 – Barranka

-1

SQL Server是一個支持多個記錄集的數據庫。所以,你可以exceute一對夫婦查詢在一個存儲過程例如

SELECT * FROM employees 
SELECT * FROM products 
SELECT * FROM depts 

然後您可以將每個記錄集之間移動。至少我知道你能舉例來說做到這一點在.net

using (var conn = new SqlConnection("connstring")) 
using (var command = new SqlCommand("SPName", conn)) 
{ 
    conn.Open(); 
    command.CommandType = CommandType.StoredProcedure; 
    var (reader = command.ExecuteReader()) 
    { 
     while(reader.Read()) 
     { 
      //Process all records from first result set 
     } 
     reader.Next(); 
     while(reader.Read()) 
     { 
      //Process all records from 2nd result set 
     } 
     reader.Next(); 
     while(reader.Read()) 
     { 
       //Process all records from 3rd result set 
     } 
    } 
} 

我假設的Java將支持類似的機制

+0

感謝您的代碼片段,您描述的情況在此MS代碼中報告http://msdn.microsoft.com/en-us/library/ms378758.aspx,無論如何,我需要第一個recrodset中的數據執行第二個 – user1594895

0

當生成它的Statement對象關閉,重新執行或用於從多個結果序列中檢索下一個結果時,ResultSet對象會自動關閉。

http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html

+0

當生成它的Statement對象被關閉,重新執行或用於檢索下一個結果時,ResultSet對象會自動關閉一系列多重結果。 這就是爲什麼我們不能有多個記錄集用於聲明,但是我要求「每個連接的聲明」 – user1594895

+0

每個連接可以有多個聲明。在非多線程應用程序中,所有內容都按順序執行=>一次不能執行2條語句。 – Err