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

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

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

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

Ответы [ 4 ]

64 голосов
/ 16 января 2010

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

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

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

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

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

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

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

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

0 голосов
/ 27 декабря 2017

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

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

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

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

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

Итак, чтобы подвести итог, получить соединение с «работой» (которое я определяю как обработку сброшенных соединений путем повторного соединения без ошибки): в «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
0 голосов
/ 21 января 2015

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

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

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

...