DBCP и Hibernate на Spring не открывают мертвые соединения, почему? - PullRequest
10 голосов
/ 12 апреля 2011

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

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

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

** BEGIN NESTED EXCEPTION **

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

STACKTRACE:

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

Я погуглил и обнаружил, что с помощью 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>

1 Ответ

11 голосов
/ 12 апреля 2011

Если вы установите testOnBorrow, вы также должны установить validationQuery -

validationQuery - SQL-запрос, который будет использоваться для проверки соединений из этого пула перед возвратом их вызывающей стороне.Если указан, этот запрос ДОЛЖЕН быть оператором SQL SELECT, который возвращает хотя бы одну строку.

Я также установил timeBetweenEvictionRunsMillis, чтобы из пула удалялись неработающие соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...