기술지원 문의

커넥션을 반환하려 합니다.
김승태 / 2003-04-09 00:00

게시판을 있는것처럼 
if (conn != null) 
conn.close(); 
이렇게 했는데 처음에는 제대로 DB에서 값을 가져오다
몇번더 사용하면 DB에서 데이터를 가져오지못합니다.
커넥션을 끊지않고 반환하려면 어떻게 해야하죠.
설정은 아래와 같습니다.
=================================================

  jdbc/cshop
  javax.sql.DataSource
  
  
  
  
  
  

=================================================
JSP에서는 확인해봤고 
DB를 관리하는 빈에서 
아래와 같이 사용했습니다.
=================================================
public long selectCountLong(String query) {
  long result = 0L;
  try {
    ic = new InitialContext(); 
    ds = (DataSource) ic.lookup(\"java:comp/env/jdbc/cshop\"); 
    conn = ds.getConnection(); 

    stmt = conn.createStatement();
    rs = stmt.executeQuery(query);
    if(rs.next())
      result = rs.getLong(1);
  }
  catch(SQLException se) {se.printStackTrace();}
  catch(Exception e) {
    e.printStackTrace();
}
finally {
  try {
    if(prestmt != null)
      prestmt.close();
  }
  catch(SQLException _ex) { }
    try {
      if(conn != null)
        conn.close(); //===========> 커넥션을 끊는부분
    }
  catch(Exception e) {e.printStackTrace(System.err);}
  }
  return result;
}
=================================================

Re:커넥션을 반환하려 합니다.
관리자 / 2003-04-10 00:00

Connection Pool을 이용하고 이것을 반환하는 것이
close입니다만 이것은 DB와의 connection을 끊는 것이
아니고 Pool에 반환하는 것입니다.
Pool에 반환된 Connection은 설정에 따라
일정시간 Pool속에서 대기하다가 다시 재사용될 수 도
있고 실제로 DB와의 Connection이 끊기고  Pool에서
제거되기도 합니다.

그러니 DB Connection Pool을 올바르게 이용하는 것은
사용하고 정확하게 Connection을 close해주기만 
하면 되는 것입니다.

아래 JSP 소스에서는 finally의 try블럭에서  Psmtp를 close하고
문제가 발생하면 catch블럭의 conn.close하는 구조로
되어있는데 이렇게 하면 결국 conn.close가 실행되지 
않게 되고 결국 Resin의 설정에 따른 20개의 connection을
넘으면 DB에 접근할 수 없게 됩니다. 최소한 conn.close가
finally의 try블럭에 있어야 할 것 같네요.

그럼 이만...



--김승태 님의 글 [2003-04-09 14:19:08]
>게시판을 있는것처럼 
if (conn != null) 
conn.close(); 
이렇게 했는데 처음에는 제대로 DB에서 값을 가져오다
몇번더 사용하면 DB에서 데이터를 가져오지못합니다.
커넥션을 끊지않고 반환하려면 어떻게 해야하죠.
설정은 아래와 같습니다.
=================================================

  jdbc/cshop
  javax.sql.DataSource
  
  
  
  
  
  

=================================================
JSP에서는 확인해봤고 
DB를 관리하는 빈에서 
아래와 같이 사용했습니다.
=================================================
public long selectCountLong(String query) {
  long result = 0L;
  try {
    ic = new InitialContext(); 
    ds = (DataSource) ic.lookup(\"java:comp/env/jdbc/cshop\"); 
    conn = ds.getConnection(); 

    stmt = conn.createStatement();
    rs = stmt.executeQuery(query);
    if(rs.next())
      result = rs.getLong(1);
  }
  catch(SQLException se) {se.printStackTrace();}
  catch(Exception e) {
    e.printStackTrace();
}
finally {
  try {
    if(prestmt != null)
      prestmt.close();
  }
  catch(SQLException _ex) { }
    try {
      if(conn != null)
        conn.close(); //===========> 커넥션을 끊는부분
    }
  catch(Exception e) {e.printStackTrace(System.err);}
  }
  return result;
}
=================================================