태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바


"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
Tomcat 5.x에 DBCP Connection을 이용하여 MySQL 5.x를 연결하여 사용하고 있다. 운영하다가 가끔 Already closed.. 어쩌구 하는 에러가 발생한다. 그리고는 다시 접속하면 잘 동작한다. 이렇게 가끔 나는 에러 잡기도 힘든데 ㅠㅠ...

구글링을 해보니 원인은 간단하다.

상황

DB 연결부분은 아래와 같은 설정이다. 

server.xml 또는 context.xml
    <Resource name="jdbc/MyDS" auth="Container" type="javax.sql.DataSource"
        username="nextree"
        password="xxx"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/nextree"/>

다음과 같은 예외가 가끔 떨어지고 다시 접속하면 자~알 된다.

Caused by: java.sql.SQLException: Already closed.
at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:84)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:313)
...


원인

Tomcat이 DB pool에서 MySQL connection을 물고 있더라도 MySQL 입장에서는 오래된 connection을 문제라고 생각하고 끊어버린다. 오랜만에 애플리케이션에 접속하여 끊어진 connection을 사용할 경우 발생한다.
즉 tomcat이 사용하는 DB pool인 DBCP가 MySQL에 의해 끊어진 connection을 주고 애플리케이션이 이걸 사용하려다가 발생하는 에러이다.

해결책

DBCP가 connection을 돌려주기 전 해당 connection이 살아있는지 검사하는 설정을 해야 한다.

    <Resource name="jdbc/MyDS" auth="Container" type="javax.sql.DataSource"
        username="nextree"
        password="xxx"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/nextree"
        validationQuery="select 1" />

validationQuery 설정은 DBCP가 connection을 반환하기전 설정된 쿼리를 날려 connection이 유효한지 검사하고 유효하지 않다면 다시 연결하여 유효한 connection을 반환한다.

이 설정은 대부분의 WAS가 모두 지원하고 운영서버에서 반드시 해주어야하는 설정인데... 신경을 써야한다.
그 외 운영 서버에서  권장되는 설정은 아래 URL을 참조하면 된다.



크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠