나는 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에서 수행 한 어떤true
에
dbcp.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>
이것은 Hibernate가 DBCP로부터 하나의 연결을 차용 할 때마다이 쿼리가 실행된다는 것을 의미합니까? 너무 무겁지 않니? – gotch4
매우 빠르게 실행되는 작은 쿼리 여야합니다. Hibernate가 각 연결에 대해 작은 쿼리가 아닌 몇 가지를 실행한다고 가정하면, 하나 더 작은 쿼리는 성능에 영향을주지 않습니다. – Tarlog
hm .... 그래, 나는 SELECT 1을 사용했다. (dbcp 위키에서 제안했다.) 어쨌든, 나는 최대 절전 모드가 세션을 열 때마다 연결을 얻을 것이라고 생각한다. 이것은 대략 컨트롤러가 요청을 처리 할 때마다이를 의미합니다. 이게 그냥 mySQL 관련 문제가되기를 바랍니다. – gotch4