DB 접속후에 close를 하려고 할 때.
해나
책을 보면서 공부하고 있습니다.
아래 소스는 zipcode.java에 있는 ResultSet search()메소드 입니다.
search()의 return값(rs)를 받아서 jsp뿌려주려고 합니다.
소스보시면 주석문 해둔 부분이 있습니다.
이렇게 주석 처리(Connection객체와 Statement객체를 close하는 부분)를 하면은 제가 원하는 값이 나옵니다.
하지만 주석문을 없애면(Connection객체와 Statement객체를 close하게 되면)은 에러와 함께 ResultSet is closed 라는 문구가 나옵니다.
Connection객체와 Statement객체를 close하지 않아도 동작은 하지만 close해주고 싶을 때는 어떻게 해야하나요??
---- zipcode.java ------
public ResultSet search(){
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String sql;
try {
Class.forName(driver);
//String url = this.url + ?useUnicode=true&characterEncoding=KSC5601;
con = DriverManager.getConnection(url, zipcode, zipcode);
stmt = con.createStatement();
sql = select * from zipcode;
rs = stmt.executeQuery(sql);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
try {
stmt.close();
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
return rs;
}
-
앵겨쭈
허거걱^^
이렇게 많은 답변이^^
그렇군요 close를 해줘야하는군요^^
Collection객체에 담아서 보내고 finally에서 close를 해줘야겠군요^^
모두들 감사드립니다^^ -
보나
이런거 질문할때는 에러 로그를 같이 올리면 더 알기 쉽겠죠. 그리고 윗분들 말씀이 맞는거 같네요.
-
시나브로
흠...이젠 asp인지.. jsp인지 기억도 안나는..ㅠㅠ
Wrox의 Oracle관련 서적을 봤던건가... ASP의 ADO를 봤던건가 기억이 애매하긴 하나..
커넥션을 유지해주는 녀석이 있긴했었는데 너무 오래되서 가물거리네요.
일반적으로는 RS를 외부에서 받아서 쓰고 싶으시면 Collecton객체에 담아서 보내셔야합니다.
Connection을 다른곳에서 이용하는 구조라면야 기존 소스의 주석부분을 삭제하시고
명시적으로 다른곳에서 해제 가능하도록 해 주셔 -
소심한여자
저도 공부하는입장이라 잘은 모르지만.윗분처럼하시는게..전 DTO에 담아서 보내는데 마지막에 finally에서 close해주고
-
세나
아 한가지 리턴타입을 ResultSet으로 해 놓으시면 다음 단계에서 에러 납니다.
finally에서 close를 했기 때문에...
맨 위의 분 말 처럼 다른 객체에 데이터를 담아서 리턴하세요 -
솔찬
Connection과 Statement, ResultSet은 사용후에 반드시 close를 해 주어야 합니다.
Connection을 close 안했을 경우 얼마 안가서 DB Pool이 다 차서(DB Connection Pool을 사용할 경우) 사용할 자원이 없기 때문에 서비스가 안 되는 장애가 발생합니다.
Connection Pool을 사용을 안 할 경우에도 수 많은 connetion이 맺히기 때문에 DB에 무리를 줘서 결국에는 장애로 이어집니다.
그리고 -
일진누나
List zipList = new ArrayList();
while ( rs.next()){
zipList.add( rs.getXXX(..) );
}
return List;
이런 식으로 하고 db 자원 해제는 finally {..} 안에서 하셔야 안전하지요. -
피라
내안의나님 답변 감사드립니다^^
특별히 끊어주어야 할 이유는 없습니다^^
코딩습관상 저런게 있으면 찝찝해서요 ㅎㅎ
좋은 하루 보내세요^^ -
도래
한마디로 반환 타입을 바꾸라는 말이죠 ㅎ;
-
양자리
저도 초보인지라 틀릴수도 있겠지만....;;
제 생각을 말씀드리면, 메서드의 반환 타입이 ResultSet이므로 Connection과 Statement를 끊어선 안될겁니다. 그래도 끊고 싶으시다면, select문의 결과물을 ArrayList나 Enumeration등에 넣으신 후 그걸 반환 하신 후에 Connection과 Statement를 종료하시면 되겠지요.