WAS/WebLogic

[TroubleShooting] WebLogic JDBC connection leak 해결방안

투칼론 2016. 8. 11. 21:24
반응형

1. JDBC Connection Leak 이란?


DB 접근을 위해 Connection Pool 자원을 사용하는데 이를 반납하지 않아, 사용가능한 Connection Pool이 지속적으로 줄어드는 현상을 말한다.



2. JDBC 프로그램 예제


......

DataSource ds = null;

Connection con = null;
Statement stmt = null;
ResultSet rs = null;

String query = "SELECT EMPNO, ENAME FROM EMP";


try {
    ctx = new InitialContext();
    ds = (DataSource)ctx.lookup("java:OracleDS");  

    con = ds.getConnection();

    stmt = con.createStatement();
    rs = stmt.executeQuery(query);


    while(rs.next()) {

    ......
    }

}catch(Exception exception){

}finally{

if(rs!= null) try { rs.close(); } catch(Exception ex){}
if(stmt!= null) try {stmt.close(); } catch(Exception ex){}
if(con!= null) try { con.close(); } catch(Exception ex){}

}



3. Leak 발생원인


WebLogic에서 제공하는 JDBC Connection Pool을 이용하여 DB를 조작하는 프로그래밍(위 예시 참조)할 때, 보통 ResultSet, Statement, Connection을 생성하거나, 얻어서 코드를 작성 한다.

이때 사용한 ResultSet, Statement, Connection 자원에 대하여 반드시 close()를 통해 자원을 반납해야 하는데, 반납하지 않는 경우에 발생한다. 위의 예제 프로그램에서 붉은 글씨 부분을 처리하지 않았을 때 발생한다.


ResultSet과 Statement 객체를 여러 개 생성하였다면, 생성한 모든 자원에 대해 반납 해야한다.


4. Connection Leak을 해결하기 위한 자동 복구 및 Profiling 방법


수많은 소스 코드를 모두 확인하는 방법도 있겠지만, 다행히도 WebLogic에서는 쉽게 찾을 수 있도록 기능을 지원한다.


1) Enable Connection Leak Profiling 옵션 활성화 (only WSL 10g 이하 버전)

JDBC Data Source > Configuration tab > data_source name > Connection Pool > Configuration tab 에서 아래 "Advanced"를 클릭하여, "Enable Connection Leak Profiling" 옵션을 체크하면 됨

[참고] 이 옵션은 10g까지 설정이 필요하고, 11g 버전부터는 옵션이 없어짐


2) Inactive Connection Timeout 설정

Inactivity 후 경과된 시간(단위는 초)이 지나면, 해당 Connection은 Connection Pool로 강제로 자원 반납시킴. 기본값은 0으로 설정되어 있음. 0이라는 의미는 이 feature가 disable 되었다는 의미임.


즉,  해당 Timeout을 설정하기 위해서는,

JDBC Data Source > Configuration tab > data_source name > Connection Pool > Configuration tab 에서 아래 "Advanced"를 클릭하여, "Inactive Connection Timeout" 값을 지정해야 한다.

예를들어, 60을 입력하면, 60초(1분) 동안 Inactivity한 상태가 지속되면, Connection Pool로 자원 반납함



5. 해결 방안


위의 설명과 같이 "Inactive Connection Timeout" 설정 값에 의해 자동 복구되지만, 근본적인 소스 오류를 찾아 해결해야 한다.


해당 소스는 위의 "Enable Connection Leak Profiling" 옵션이 활성화되면, WebLogic Server 로그 파일에 아래와 같은 Profiling 로그가 있으면, 해당 소스를 확인하여 ResultSet, Statement, Connection 자원이 반납되었는지 확인 후에 맞게 수정하면 된다.


 <Aug 15, 2016 10:51:37 AM SGT> <Warning> <JDBC> <BEA-001153> <Forcibly releasing inactive connection "weblogic.jdbc.wrapper.PoolConnection_oracle_jdbc_driver_T4CConnection@14267" back into the connection pool "JDBC Data Source-0", currently reserved by: java.lang.Exception

        at weblogic.jdbc.common.internal.ConnectionEnv.setup(ConnectionEnv.java:218)

        ...

        ... executeQuery(...)

        ...


참고로, 웹로직 웹콘솔에서 JDBC 모니터링 항목에서 "Leaked Connection Count" 컬럼 값을 확인하여 Connection Leak 이 발생한 수를 확인할 수 있다.