연결 IDLE 타임아웃이 기본값이 8시간으로 되어있다고 한다.
wait_timeout=28800
interactive_timeout=28800
그래서 주말처럼 별다른 트랜잭션이 없으면 아래와 같은 예외가 발생하게 됨.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
Last packet sent to the server was 0 ms ago.
at sun.reflect.GeneratedConstructorAccessor102.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4874)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
일단 타임아웃을 늘려서 돌려보고 그래도 해결이 안 되면 커넥션 풀을 따로 만들어줘야 되나 싶다. 요새 하이버네이트 버전에서 DBCPConnectionProvider가 안 보이는 것으로 보아 DBCP는 아예 지원이 끊긴 것 같고.. 그렇다고 c3p0을 붙여보려니 번들링 해놓은걸 따로 붙여봐야 되나.. autoReconnect=true는 안 먹힌다는 말이 많던데 어떨란지.. 이래저래 골 아픈 문제..




덧글
우주괴물 2009/07/08 12:53 # 답글
저희는 다른 미들웨어를 쓰긴 하는데 같은 문제가 있어서 어플리케이션에서 5분 주기로 더미 쿼리를 날려주고 있습니다. -_-;
몬스터 2009/11/20 22:00 # 삭제 답글
그럴땐 validationQuery="SELECT 1" 라고 conect Resouce 에 추가 하시고JDBC url 에 autoReconnect 대신에 autoReconnectForPool=true
이란 옵션이 있는데 mysql 홈페이지 가셔서 드라이버정보 보면 있어요
xeraph 2009/11/20 22:10 #
알려주셔서 감사합니다~