Проблема пула соединений с MySQL с использованием Hibernate и Apache DBCP

Кажется, проблема в моем приложении. Когда когда-либо приложение простаивает очень долгое время (я не уверен в точном времени), при запуске я получаю следующее сообщение об ошибке в моих журналах. Я использую Spring + Hibernate + MySQL и ApacheDBCP для пула соединений.

ERROR [org.hibernate.util.JDBCExceptionReporter]The last packet successfully received from the server was 74,188,684 milliseconds ago. 
The last packet sent successfully to the server was 74,188,685 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
org.hibernate.exception.JDBCConnectionException: could not execute query

Если я перезапущу URL-адрес, все будет работать нормально. Я предполагаю, что это как-то связано с моим пулом подключений. Вот мой параметр Apache DBCP, а для параметра wait_timeout в MYSQL установлено значение по умолчанию. (28800 секунд или 8 часов).

<beans:bean id="MyID" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <beans:property name="url" value="jdbc:mysql://localhost:17761/myDB"/>
        <beans:property name="username" value="myname"/>
        <beans:property name="password" value="mypwd"/>
        <beans:property name="maxIdle" value="5"/>
        <beans:property name="maxActive" value="20"/>
        <beans:property name="minIdle" value="5"/>
</beans:bean>

Пока я искал, я нашел этот ссылка Возможные варианты решения вопроса.

  1. Настройте строку подключения с autoReconnect = true

    Поможет ли это решить проблему? В том же вопросе, упомянутом выше, другой автор говорит, что не рекомендуется использовать это решение.

  2. Увеличение значения переменной сервера MySQL wait_timeout.

    Я не уверен, как это поможет в устранении ошибки. если это помогает, как рассчитать соответствующее значение wait_timeout. Я имею ввиду какие должны быть критерии для этого?

  3. Настройка пула подключений для проверки действительности подключения.

    После некоторого исследования я узнал, что могу использовать validationQuery = "SELECT 1" для проверки возможности подключения перед выполнением фактического запроса. Поможет ли это решить проблему? Не повлияет ли это на производительность?

Проблема связана не только с Apache DBCP, я также видел ее в C3P0.

Пожалуйста помоги.


person Srivatsa N    schedule 02.06.2013    source источник


Ответы (1)


Похоже, я нашел решение для этого. Все, что я сделал, это добавил строку ниже в свой servlet-context.xml. Все еще проверяем влияние этой строки на производительность

<beans:property name="validationQuery" value="SELECT 1"/>

Остается вопрос: почему я действительно получал ошибку? :)

person Srivatsa N    schedule 06.06.2013
comment
Может быть, вы можете дать ссылку на свой другой вопрос о том, почему вы получаете ошибку. Что касается того, повлияет ли запрос проверки на производительность: теоретически он использует соединение, чтобы что-то делать. На практике это настолько тривиально и выполняется так редко, что его влияние незначительно в контексте всей вашей системы. - person Jay; 12.06.2013