2

getConnection()을 수행하고 DBCP에서 BasicDataSource를 사용하면 finally 블록에서 연결을 닫습니다. 실제로 연결을 풀에 반환합니까 아니면 닫습니까? 연결. 내가 확인하고있는 스 니펫 코드는 다음과 같습니다.DBCP 연결 풀 connection.close()는 풀에 대한 연결을 반환합니다.

try { 
     Connection conn1 = getJdbcTemplate().getDataSource() 
       .getConnection(); 
     //Some code to call stored proc 

    } catch (SQLException sqlEx) { 
     throw sqlEx; 
    } finally { 
     try { 
      if (conn != null) { 
       conn.close(); 
      } 
     } catch (SQLException ex1) { 
      throw ex1; 
     } 

    } 

BasicDataSource의 소스 코드를 확인하고 연결에 대한이 래퍼 클래스에 도달했습니다.

private class PoolGuardConnectionWrapper extends DelegatingConnection { 

    private Connection delegate; 

    PoolGuardConnectionWrapper(Connection delegate) { 
     super(delegate); 
     this.delegate = delegate; 
    } 

    public void close() throws SQLException { 
     if (delegate != null) { 
      this.delegate.close(); 
      this.delegate = null; 
      super.setDelegate(null); 
     } 
    } 

java.sql.Connection 유형의 델리게이트 객체입니다. 래퍼 코드는 연결을 풀로 반환하지 않고 컬렉션을 닫을 대리자의 close 메서드를 호출합니다. 이 문제는 DBCP의 알려진 문제입니까, 아니면 소스 코드를 잘못 읽고 있습니다 알려주세요.

감사

+0

연결을 닫고 있습니다 ... 왜 그랬습니까? – SMA

+0

연결을 닫지 않으면 maxActive Limit에 도달 한 후에 풀이 오류를 발생시킵니다. 연결 풀에서 연결을 닫으면 연결을 닫지 않고 연결 랩퍼가 다시 풀에 넣습니다. 하지만 소스 코드에서 같은 것을 추론 할 수 없습니다. –

답변

4

당신은 풀에 반환하는 PoolableConnection.close()를 호출하게 될 겁니다.

+0

소스 코드를 읽는 동안 엉망이되었습니다! 이제는 의미가있다. –