2011-11-04 71 views
1

我有一個帶有3個參數的java.sql.CallableStatement,我需要多次調用它,爲第三個參數傳遞不同的值。多次使用`java.sql.CallableStatement`而不關閉它

這樣做的正確方法是什麼?我可以每次創建一個新的可調用語句,但據我所知它可以訪問數據庫。

當前代碼通過更改第三個參數來調用同一個語句實例,但沒有關閉它並且似乎可以工作。跳過關閉可調用語句是否正常?

它在MySQL jdbc連接上運行。

代碼片段:

CallableStatement pivot = connection.prepareCall("{CALL pivot(?, ?, ?)]"); 
pivot.setString(1, "a"); 
pivot.setString(2, "b"); 
while(someCondition) { 
    pivot.setString(3, "c"); 
    ResultSet res = pivot.executeQuery(); 
    try { 
    // ... 
    } finally { 
    res.close(); 
    } 
} 

回答

2

這樣,您現在可以節省處理呼叫的一些步驟。 您會發現,每次準備新的調用時,都必須通過優化器繼續運行db,這會花費時間和資源。一旦您的prepareCall被設置,請保持打開狀態(並在dbserver上查找)以獲得更好的性能。

你在代碼中錯過這樣的:

if(pivot == null) 
    pivot = connection.prepareCall("{CALL pivot(?, ?, ?)]"); 

你應該保持支點作爲字段而不是變量。

注意:如果你需要資源,並且你有很多preparedStatements和Calls,你應該關閉那些不經常被調用的大的語句。

我在微軟發現了這個:diagram how it workshere。我找不到更好的照片。

1

這是確定有說法打開很長一段時間,如果你自己管理的連接。然而,將這項工作委託給DataSource可能更好一些,這些工作有內部連接池(檢查Apache DBCP,或者您的JDBC驅動程序也可能有特定的實現);它也會做同樣的事情,但通常出現錯誤的概率較低。對於數據源,您必須始終關閉語句和連接才能將它們返回到池中。

相關問題