Notice
Recent Comments
행복한 아빠
Tomcat과 MySql 사용하는데 가끔 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을 참조하면 된다.
'문제발생시' 카테고리의 다른 글
Maven release시 SVN 301 에러 (0) | 2009.11.25 |
---|---|
64 bit 우분투 머신에 Continuum 설치하기 (0) | 2009.11.24 |
Tomcat과 MySql 사용하는데 가끔 Already closed 에러가 발생 (4) | 2009.11.13 |
특정 메소드를 누가 호출하는지 추적하기 (0) | 2009.10.16 |
DbUnit 에서 오라클 TIMESTAMP 타입 인식하기 (0) | 2008.09.26 |
컴파일된 class 파일의 클래스 버전 확인하기 (3) | 2008.09.20 |
4 Comments