DBCP и Hibernate в Spring, не повторно открывать мертвые соединения, почему?

I ' m с использованием Hibernate и DBCP для управления подключениями mySQL, все в проекте Spring.

Все работает нормально. Единственная проблема заключается в том, что если приложение остается неподвижным в течение длительного времени, оно генерирует исключение, потому что соединение не работает (то же самое, если я перезапускаю mySQLd, когда приложение запущено). Это не имеет большого значения, потому что пользователь получит страницу исключения (или настраиваемую), и перезагрузка решит проблему. Но я бы хотел это решить. Вот часть исключения:

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

** BEGIN NESTED EXCEPTION **

java.io.EOFException Это не имеет большого значения, потому что пользователь получит страницу исключения (или пользовательскую), и перезагрузка решит проблему. Но я бы хотел это решить. Вот часть исключения:

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

** BEGIN NESTED EXCEPTION **

java.io.EOFException Это не имеет большого значения, потому что пользователь получит страницу исключения (или пользовательскую), и перезагрузка решит проблему. Но я бы хотел это решить. Вот часть исключения:

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

** BEGIN NESTED EXCEPTION **

java.io.EOFException СООБЩЕНИЕ: Не удается прочитать ответ от сервера. Ожидается, что будет прочитано 4 байта, прочитано 0 байтов, прежде чем соединение было неожиданно потеряно.

STACKTRACE:

java.io.EOFException: Не удается прочитать ответ от сервера. Ожидалось, что будет прочитано 4 байта, прочитано 0 байтов, прежде чем соединение будет неожиданно потеряно.

Я поискал в Google и обнаружил, что с mysql я должен установить свойство dbcp.BasicDataSource testOnBorrow на true , что я сделал в моем servlet-context.xml:

<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>
10
задан gotch4 13 April 2011 в 12:49
поделиться