dbconnection 끊어지는 현상


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을 참조 해주시기 바랍니다.




http://commons.apache.org/dbcp/configuration.html

'JAVA' 카테고리의 다른 글

[JAVA]Download outOfMemory  (0) 2017.11.03
[JAVA]Dispatche :: request.getRequestDispatcher("/prg/board_excel.jsp");  (0) 2017.11.03
[JAVA] DateUtil2  (0) 2017.11.01
[JAVA]DateUtil  (0) 2017.11.01
[JAVA] context root path  (0) 2017.11.01
블로그 이미지

마크제이콥스

초보 개발자의 이슈및 공부 내용 정리 블로그 입니다.

,