Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

  • Источник данных/пул может также иметь тайм-аут, который соответствует времени, когда в пуле остается незанятое соединение. Не путать с тайм-аутом db.
  • Существует несколько способов проверить правильность подключения. Один из распространенных способов состоит в том, чтобы иметь фиктивную тестовую таблицу. Пул выдаст выбор в таблице фиктивных тестов, чтобы убедиться, что соединение все еще в порядке.

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Итак, чтобы суммировать, чтобы получить соединение с "work" (которое я определяю как включающее обработку сброшенных соединений путем повторного подключения без ошибок): В "hibernate.cfg.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.properties", который должен находиться в корне пути пути (т.е. не использовать его для определенных частей приложения):

c3p0.properties

c3p0.testConnectionOnCheckout = истина

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

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

Ответ 4

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

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

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