2014-01-17 4 views
0

나는이 클래스를 다른 클래스에서 호출하여 괜찮습니다. 그러나 열려있는 모든 단일 mysql 연결을 닫고 싶습니다. 내가 연결 trought 닫으려고 할 때 문제가 일어나고오류 "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; 


    } 

} 

: 다음

con.close(); 

을, 출력은 다음과 같습니다

내 데이터베이스에 연결하기 위해 내 클래스입니다
"Operation not allowed after ResultSet closed" 
+1

나는 연결을 닫지 못해서 오류가 발생하는 것을 매우 의심 스럽습니다. 연결이 닫히고 (결과 집합을 닫는 문을 닫음) 나중에 결과를 얻고 어쨌든 결과 집합을 사용하려고합니다. – Gimby

+0

그러면 연결을 닫고 결과 세트를 열 수 있습니까? – Sallyerik

+0

@Sallyerik 불가능하지 않습니다. –

답변

4

코드에서와 같이 Connection을 닫으면 다음과 같은 종속 개체가 나타납니다. 해당 연결에서 생성 된 ResultSet도 닫힙니다. 결과 집합이 필요한 경우 연결을 열어 둘 필요가 있거나 CachedRowSet을 사용하거나 반환하기 전에 결과 집합의 내용을 다른 것으로 전송해야합니다.

+0

좋아, 알았다. 나는 String으로 변환했거나 ArryList는 케이스에 의존하고 나서 연결을 닫는다. 또한 내 문제는 다른 클래스에서 데이터베이스를 업데이트하기 위해 호출하는 내 코드의 다른 부분에 있다는 것을 알고 있습니다. 이 다른 사람들과 con.close() 연결을 닫았습니다. 이제 내 데이터베이스의 Max_used_connections가 1700입니다. 시간을 내 주셔서 감사합니다. – 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 이후에 존재해온 기본 요구 사항 중 하나입니다. close() 동작 : JDBC 4에 추가 된 설명/개선 사항이므로 JDBC 3 드라이버 또는 사양에 맞게 신중하게 업데이트되지 않은 드라이버를 사용하면 이전 JDBC 사양에서 유효한 동작을 얻을 수 있습니다. –

관련 문제