Соединение с MySql прерывается автоматически. Как правильно настроить Connector/J?

Я прочитал этот совет из сообщения об ошибке:

вы должны рассмотреть либо истекает и / или проверка правильности соединения перед использованием в приложении, увеличивая сервер значения для таймаутов клиента или использование свойство соединения Connector/J 'autoReconnect=true', чтобы избежать этого проблема.

Я использую Spring и JPA. Где я должен настроить Connector / J? (in persistence.xml или entityManagerFactory конфигурация весны, или внутри dateSource весенняя конфигурация или где-то еще?)

4 ответов


текст описывает три решения для предотвращения прерывания соединения:

  1. настройте строку подключения с помощью autoReconnect=true. Это свойство строки подключения URL, которая работает на уровне драйвера. Необходимо изменить строку подключения в конфигурации источника данных.

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true"
    
  2. увеличить тайм-аут. Обычно это свойство базы данных. Вы можете увеличить это значение, чтобы увидеть, если вы получаете меньше связи выкинуть.

  3. настроить пул соединений для проверки validatiy связи. Это делается в бассейне, а не на уровне драйвера. Это будет зависеть от используемой реализации источника данных. Но он должен быть настроен в свойстве источника данных, если вы используете объединенный, например c3p0.

дополнительные комментарии:

  • источник данных / пул также может иметь тайм-аут, который соответствует времени простоя соединения остается в пуле. Чтобы не путать с таймаутом БД.
  • там есть несколько способов проверить правильность соединения. Один общий путь иметь фиктивную таблицу теста. Пул выдаст select на фиктивной тестовой таблице, чтобы увидеть, по-прежнему ли соединение в порядке.

AutoReconnect Не рекомендуется. Из MySQL здесь

должен ли драйвер попытаться восстановить устаревшие и / или мертвые соединения? Если включено, драйвер выдаст исключение для запросов, выданных на устаревшее или мертвое соединение, принадлежащее текущей транзакции, но попытается повторно подключиться до следующего запроса, выданного на подключение в новой транзакции. Использование этой функции не рекомендуется, поскольку он имеет побочные эффекты состояние сеанса и согласованность данных, когда приложения не обрабатывают SQLExceptions правильно, и предназначен только для использования, когда вы не можете настройте приложение для обработки SQLExceptions в результате dead и устаревшие соединения должным образом. Альтернативно, как последний вариант, исследуйте установку переменной сервера MySQL "wait_timeout" на максимум значение, а не значение по умолчанию 8 часов.


Я прошел через множество решений, и моя проблема была решена, но через некоторое время соединение тайм-аут или отключено.После 2 3 дней я получил решение, которое решит мою проблему.

многие решения предлагают использовать autoReconnect=true но когда я проходил через документы. Я видел следующий текст в источнике, описывающий параметр autoReconnect:

использование этой функции не рекомендуется, так как она имеет побочные эффекты, связанные с состоянием сеанса и согласованность данных

когда я посмотрел в коде спящего режима. Основной механизм подключения Hibernate не поддерживает повторное подключение, нужно использовать пул соединений H3C0 (который сам не всегда поддерживал повторное подключение).

но как только используется H3C0, поведение по умолчанию кажется, что для обработки запроса, если соединение мертво, то пользователь видит и ошибку - но, по крайней мере, он снова подключается к следующему запросу. Я полагаю, что одна ошибка лучше, чем бесконечные ошибки, но все равно не так хорошо, как ноль ошибок. Оказывается, требуется optiontestConnectionOnCheckout - который документация не рекомендует, потому что тестирование соединения до запроса может привести к снижению производительности. Конечно, программное обеспечение, во-первых, должно работать, только во-вторых, оно должно работать быстро.

Итак, подводя итог, чтобы получить соединение с " работой "(которую я определяю как включающую обработку отброшенных соединений путем повторного подключения без ошибок): в "зимовать.контекстно-свободная грамматика.xml":

  <!-- hibernate.cfg.xml -->
    <property name="c3p0.min_size">5</property>
    <property name="c3p0.max_size">20</property>
    <property name="c3p0.timeout">1800</property>
    <property name="c3p0.max_statements">50</property>
    <!-- no "connection.pool_size" entry! -->

создайте файл "c3p0.свойства", которые должны быть в корне пути к классам (т. е. нет способа переопределить его для определенных частей приложения):

c3p0.свойства

c3p0.testConnectionOnCheckout=true

Если это решение не работает, чем есть больше возможных решений: -

1. Add

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

 Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml:

<property name="hibernate.c3p0.validate">true</property>

    Also checkout the last post on this page:

    https://forum.hibernate.org/viewtopic.php?p=2399313

    If all these not work than go [more][1] and read in detail


  [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html

это для таких людей, как я, которые находят эту старую публикацию через поисковые системы.

другие ответы лучше долгосрочной перспективе решений. Но если вам просто нужно mysql соединение работает снова сразу, вы можете shutdown затем restart tomcat и все будет работать нормально на некоторое время. Это позволяет избежать простоя системы во время поиска долгосрочного решения.

перейти к $CATALINA_HOME на terminal тип shutdown.sh, затем введите startup.sh. Подождите несколько минут для завершения последовательности запуска, затем ваши приложения будут работать снова некоторое время.