it-roy-ru.com

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

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

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

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

45
Roman

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

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

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

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

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

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

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

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

18
Gaurav Agarwal

Мне пришлось пройти через множество решений, и моя проблема была решена, но через некоторое время соединение прервалось или прервалось. Через 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 = 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
0
Ravindra