2011-04-12 3 views
10

나는 Spring 프로젝트에서 mySQL 연결을 관리하기 위해 Hibernate와 DBCP를 사용하고있다.봄에 DBCP와 Hibernate가 죽은 연결을 다시 열지 않는 이유는 무엇입니까?

모든 것이 잘 작동합니다. 유일한 문제는 응용 프로그램이 오랫동안 계속 남아 있으면 연결이 끊어져서 예외가 발생합니다 (응용 프로그램이 작동 중일 때 mySQLd를 다시 시작하면 동일한 문제임). 사용자가 예외 페이지 (또는 사용자 지정 페이지)를 가져오고 다시로드하면 문제가 해결 될 것이므로 큰 문제는 아닙니다. 그러나 나는 그것을 해결하고 싶다.

com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

**는 상자의 예외를 BEGIN **

java.io.EOFException 메시지 : 다음은 예외의 일부 서버에서 응답을 읽을 수 없습니다. 연결이 예기치 않게 손실되기 전에 4 바이트를 읽을 것으로 예상되며 0 바이트를 읽습니다.

스택 트레이스 :

java.io.EOFException는 : 서버로부터 응답을 읽을 수 없습니다. 연결이 예기치 않게 손실되기 전에 4 바이트를 읽을 것으로 예상되며 0 바이트를 읽습니다.

나는 주위를 봤 내가 MySQL과 내가 내 서블릿의 context.xml에서 수행 한 어떤 truedbcp.BasicDataSource 특성 testOnBorrow을 설정해야합니다 발견 :

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://${mySQL.host}/${mySQL.db}" /> 
    <property name="username" value="${mySQL.user}" /> 
    <property name="password" value="${mySQL.pass}" /> 
    <property name="testOnBorrow" value="true"></property> 
</bean> 

하지만 문제가 지속. 모든 단서?

솔루션! 내가 사용 :

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://${mySQL.host}/${mySQL.db}" /> 
    <property name="username" value="${mySQL.user}" /> 
    <property name="password" value="${mySQL.pass}" /> 
    <property name="testOnBorrow" value="true"></property> 
    <property name="validationQuery" value="SELECT 1"></property> 
</bean> 

답변

11

당신이 testOnBorrow 설정하면 당신은 또한 validationQuery 설정해야합니다 - validationQuery

을 - 호출자에게 반환하기 전에이 풀 에서 유효성을 연결하는 데 사용되는 SQL 쿼리. 지정된 경우이 쿼리는 적어도 하나의 행에 반환하는 SQL SELECT 문이어야합니다.

또한 timeBetweenEvictionRunsMillis을 설정하여 연결이 끊어 지도록합니다.

+0

이것은 Hibernate가 DBCP로부터 하나의 연결을 차용 할 때마다이 쿼리가 실행된다는 것을 의미합니까? 너무 무겁지 않니? – gotch4

+0

매우 빠르게 실행되는 작은 쿼리 여야합니다. Hibernate가 각 연결에 대해 작은 쿼리가 아닌 몇 가지를 실행한다고 가정하면, 하나 더 작은 쿼리는 성능에 영향을주지 않습니다. – Tarlog

+0

hm .... 그래, 나는 SELECT 1을 사용했다. (dbcp 위키에서 제안했다.) 어쨌든, 나는 최대 절전 모드가 세션을 열 때마다 연결을 얻을 것이라고 생각한다. 이것은 대략 컨트롤러가 요청을 처리 할 때마다이를 의미합니다. 이게 그냥 mySQL 관련 문제가되기를 바랍니다. – gotch4

관련 문제