com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
풀의 커넥션이 타임아웃 되서 그렇다.
- 다음중 하나를 설정하면 해결된다.
1. 커넥션 설정부분에 autoReconnect=true를 붙힘
2. <property name="validationQuery" value="select 1"/>
3. mysql의 대기시간을 늘림
[출처] com.mysql.jdbc.CommunicationsExceptio... |작성자 타쿠미
pool 에서 Connection 을 가져올때 이미 끊어 져서 사용할 수 없다는 소리다..
wait_timout 으로 connection 을 관리 하는데.. 넘어 버리면 짤려 버리는 현상..
wait_timeout을 늘리면 된다.
sessionVariable 은 connection 에 대해서만 variable을 설정할수 있다. pool에서 connection 을 생성할때 참조 하는 값이 url에
sessionVariable을 설정하면 pool의 커넥션에 대해서만 긴주기의 wait_timeout을 설정할수 있다.
나 같은 경우 원격지 서버 컴퓨터의 방화벽이 문제였다.
해결 방법은 방화벽 해제였다.
[출처] CommunicationsException: Communications link failure |작성자 즐거웁게
dbcp를 이용하여 mysql db를 사용중인데..
mysql wait_timeout 설정(기본값 28800 , 8시간) 에 의해 커넥션이 연결된 이후 해당
커넥션의 close 없이 8시간이 지나면 해당 커넥션을 종료 시키게 된다.
문제는 이렇게 종료된 커넥션을 dbcp의 connection pool 에선 여전히 가지고 있는 상태라는 것이다.
이런 상황에서 DB 관련 프로그램이 호출되면 커넥션 관련 에러가 발생된다.
해결방법은 java에서 DB를 사용하기 전에 해당 connection 이 정상적인지 검사를 하도록 하는 것이다.
이 옵션이 validationQuery 파라메터이다.
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="validationQuery" value="select 1"/>
</bean>
와 같이 사용하면 된다.
출처 dbcp pooling 설정에 validationQuery 적용 |작성자 왕건달
다음과 같은 에러가 나타날 때 처리
com.enrise.framework.exception.DSSqlException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.net.SocketException STACKTRACE: java.net.SocketException: Software caused connection abort: socket write error ...... |
해결 -> http://amitcodes.wordpress.com/2008/07/26/16/
위에 링크를 한 블로거의 설명 및 해결 방법 이다.
Cause: MySQL
server has a default timeout period after which it terminates the idle
connections. This period is 8 hours by default. Now here’s what happens.
The dbcp creates a set of connections to database when the servlet
container / application server starts up. If the connections are not
used for the tinmeout period, the MySQL server assumes these to be dead
connections and terminates them. The dbcp, however, is unaware of the
fact that the connections have been terminated. So when a connection is
demended from the connection-pool, these dead connections are returned
and when a call is made on these dead connections – *BOOM* – you the
java.net.SocketException: Broken pipe exception. Ok – so what’s the fix
??
Fix: If only the connection pool could check if the the connection it is about to return is live or not, the porblem is fixed. This can be done in apache-common-dbcp (I know this one coz I used it, please look into documentation of the connection-pool you are using). Here’s how you do it: You add the following properties to dbcp configuration.
· validationQuery=”SELECT 1″
· testOnBorrow=”true”
And that does the trick.
How it works:
· Before returning the connection from pool to the application, dbcp runs the “SELECT 1 ” query on the connection to see it it is still live. That’s the job of validationQuery.
· As for testOnBorrow, you tell dbcp to perform the check before returning the connection to application.
For more details refer to the apache-common-dbcp configuration manual here . The apache-commons-dbcp config:
<Resource name="jdbc/cooldatabase" | ||
description="Strandls.com license database" |
auth="Container" | ||
type="javax.sql.DataSource" |
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" | ||
driverClassName="com.mysql.jdbc.Driver" |
url="jdbc:mysql://localhost:3306/cooldatabase?autoReconnect=true" | |||
username="cooluser" |
password="coolpassword" | ||
initialSize="0" |
maxActive="20" | ||
maxIdle="10" |
minIdle="0" | ||
maxWait="-1" |
validationQuery="SELECT 1" | ||
testOnBorrow="true" |
poolPreparedStatements="true" | ||
removeAbandoned="true" |
removeAbandonedTimeout="60" | ||
logAbandoned="true"/> |
The complete stacktrace:
[ERROR] 12:27 (JDBCExceptionReporter.java:logExceptions:78)Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.SocketExceptionMESSAGE: Broken pipe
STACKTRACE:
java.net.SocketException: Broken pipeat
java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2689)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2618)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1551).....
--------------------------------------------------------------------------------------------------------------------------
요약 하자면…
원인: MySQL은 디폴트 타임아웃 값을 가지고 있다. 만약 커넥션이 생성되고, 이 타임아웃 기간이 지날 동안 사용되지 않는다면 이 커넥션은 끊긴 것으로 간주하고 커넥션을 종료한다. 하지만 dbcp는 커넥션이 끊어졌음을 알아채지 못하고, 커넥션 요청이 있을 때 연결이 끊긴 커넥션을 돌려준다. 그래서 에러가 발생한다.
수정: DBCP configuration 에 다음 사항을 추가한다.
· validationQuery=”SELECT 1″
· testOnBorrow=”true”
· url="jdbc:mysql://localhost:3306/dbPoolName?autoReconnect=true”
동작하는 방식
l 어플리케이션에 커넥션을 리턴하기 전에 dbcp는 “SELECT 1”쿼리를 실행해서 해당 커넥션이 살아있는지 확인한다. 이 작업이 ‘validationQuery’ 이다.
l testOnBorrow 를 설정함으로써 커넥션을 어플리케이션에 돌려주기 전에 dbcp가 체크하도록 한다.
< 설 명 >
'autoReconnect'옵션을 주게 되면, 커넥션에 문제가 있을 경우 다시 접속하게 된다.
그러나, 이 경우에도 끊어진 후 처음 한번의 시도는 실패가 나게 된다(이때 문제가 있다는것을 알게 되는 것이므로..).
이때는 추가적인 DBCP옵션인 'validationQuery'값의 설정으로 해결 가능하다.
validationQuery="select 1" => MySQL의 경우
validationQuery="select 1 from dual" => Oracle의 경우
maxActive 커넥션 풀이 제공할 최대 커넥션 개수
maxIdle 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 개수. 음수일 경우 제한이 없다.
maxWait whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간. 단위는 1/1000초이며, 0 보다 작을 경우 무한히 대기한다.
testOnBorrow true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사한다.
testWhileIdle true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거한다.
timeBetweenEvctionRunsMillis 사용되지 않은 커넥션을 추출하는 쓰레드의 실행 주기를 지정한다. 양수가 아닐 경우 실행되지 않는다. 단위는 1/1000 초이다.
minEvictableIdleTimeMillis 사용되지 않는 커넥션을 추출할 때 이 속성에서 지정한 시간 이상 비활성화 상태인
커넥션만 추출한다. 양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않는다. 시간 단위는 1/1000초이다.
'Programming > SQL' 카테고리의 다른 글
mysql 사용자/권한 관리 (0) | 2016.01.13 |
---|---|
mysql 입력시 중복 데이터 (0) | 2014.07.17 |
[오라클] 트리거 TRIGGER (1) | 2012.02.03 |
Toad에서 DB Export 하기 (0) | 2011.12.23 |
TOAD script 추출하기(Database Script, Schema Script) (0) | 2011.12.08 |
댓글