2014-01-17 68 views
0

我從我的appiclation的其他部分調用此類,它工作正常。不過,我想關閉已打開的每個mysql連接。錯誤「ResultSet關閉後不允許操作」在Mysql連接關閉時

這是我的類連接到我的數據庫:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 





public class BACENGQueryDatabases { 
    public String Query; 


    public BACENGQueryDatabases(String Query){ 
     this.Query = Query; 
    } 

    public ResultSet LoadQuery() throws Exception{ 

    // Accessing Driver From Jar File 
    Class.forName("com.mysql.jdbc.Driver"); 

//Get credentials from Property file 
BACENGPropertiesFile user = new BACENGPropertiesFile("user.cred"); 
BACENGPropertiesFile passwd = new BACENGPropertiesFile("passwd.cred"); 
BACENGPropertiesFile database = new BACENGPropertiesFile("database.system"); 
BACENGPropertiesFile DBServer = new BACENGPropertiesFile("DBServer.system"); 
BACENGPropertiesFile DBPort = new BACENGPropertiesFile("DBPort.system"); 

Connection con = null; 
PreparedStatement pst = null; 
ResultSet rs = null; 


//DB Connection 

      con = DriverManager.getConnection("jdbc:mysql://"+DBServer.properties()+":"+DBPort.properties()+"/"+database.properties()+"",""+user.properties()+"",""+passwd.properties()+"");  
    //DB Connection 
      String sql =Query; 
      pst = con.prepareStatement(sql); 
    //System.out.println(sql); //Just to test 

      rs=pst.executeQuery(); 

    con.close(); 
    return rs; 


    } 

} 

當我嘗試關閉連接trought問題正在發生的事情:

con.close(); 

然後,輸出是:

"Operation not allowed after ResultSet closed" 
+1

我非常懷疑你從關閉連接中得到這個錯誤,你在連接關閉後關閉連接(關閉語句,關閉結果集),然後嘗試使用結果集。 – Gimby

+0

然後,將可能關閉連接keepig結果集打開? – Sallyerik

+0

@Sallyerik不,這是不可能的。 –

回答

4

當你像你在代碼中那樣關閉Connection時,那麼任何依賴對象從該連接創建的ResultSet也關閉。只要您需要結果集,您就需要保持連接處於打開狀態,請使用CachedRowSet或在返回結果集之前將結果集的內容傳輸給其他人。

+0

好吧,我明白了。我已經將它轉移到String或ArryList取決於大小寫,然後關閉連接。另外我意識到我的問題是在我的代碼的其他部分調用其他類來更新數據庫。我用con.close()關閉了這個其他連接,現在我的數據庫中的Max_used_connections是17,而不是500。謝謝你的時間。 – Sallyerik

+0

那麼,[規範](http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#close())說:「調用ResultSet對象上的close方法已關閉是沒有操作的「,並且[類似地](http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#close())」調用方法關閉一個已經關閉的Connection對象是沒有操作的「,但我也發現數據庫驅動程序供應商高興地違反了這個合同。 – Holger

+0

@Holger我不完全確定你評論的重點是什麼;是的,並不是所有驅動程序都完全遵循規範,但這是自JDBC 1以來存在的基本要求之一.Re' close()'行爲:這是JDBC 4中添加的一項澄清/改進,因此如果使用JDBC 3驅動程序或未仔細更新到規範的驅動程序,那麼您可能會得到在舊版JDBC規範中有效的行爲。 –

相關問題