У меня есть хорошее маленькое веб-приложение Spring Boot JPA. Он развернут на Amazon Beanstalk и использует Amazon RDS для хранения данных. Однако он используется не так часто и поэтому через некоторое время выходит из строя с таким исключением:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: последний пакет, успешно полученный от сервера, был 79870633 миллисекунды назад.
Последний пакет, успешно отправленный на сервер, был 79 870 634 миллисекунды назад. длиннее, чем заданное сервером значение 'wait_timeout'. Вам следует рассмотреть возможность истечения срока действия и / или проверки действительности соединения перед использованием в вашем приложении, увеличения значений, настроенных сервером для тайм-аутов клиента, или использования свойства соединения Connector / J 'autoReconnect = true', чтобы избежать этой проблемы.
Я не уверен, как настроить этот параметр, и не могу найти информацию о нем на http://spring.io (хотя и очень хороший сайт). Какие идеи или указатели на информацию?
источник
DataSource
и проверить его свойства. stackoverflow.com/a/36586630/148844 Spring Boot не будет автоматически настраиватьDataSource
файлы,@Beans
которые определяют файлDataSource
. docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/…Ответы:
Я предполагаю, что загрузка настраивает
DataSource
для вас. В этом случае и поскольку вы используете MySQL, вы можете добавить следующее в свойapplication.properties
до 1.3Как было отмечена djxak в комментариях, 1.4+ определяет конкретные пространства имена для четырех соединений бассейнов Пружины загрузка поддерживает:
tomcat
,hikari
,dbcp
,dbcp2
(dbcp
нежелательно 1.5). Вам необходимо проверить, какой пул соединений вы используете, и проверить, поддерживается ли эта функция. Приведенный выше пример был для tomcat, поэтому в 1.4+ вам придется написать его следующим образом:Следует отметить , что использование
autoReconnect
является не рекомендуется :источник
spring.datasource.testOnBorrow
и другоеspring.datasource.test-on-borrow
подойдет. Проверьте документацию для получения более подробной информации.SELECT 1
гарантирует, что соединение было протестировано перед передачей приложению. При использованииtestOnBorrow = true
объекты будут проверяться перед заимствованием из пула. Если объект не прошел проверку, он будет удален из пула и попытается заимствовать другой. ПРИМЕЧАНИЕ - для того, чтобы истинное значение оказало какое-либо влияние, параметр validationQuery должен быть установлен в ненулевую строку.tomcat
,hikari
,dbcp
,dbcp2
. Так, например, дляtomcat-jdbc
пула соединений свойства должны быть:spring.datasource.tomcat.testOnBorrow=true
иspring.datasource.tomcat.validationQuery=SELECT 1
.If you define your own DataSource bean, auto-configuration will not occur.
Я следовал руководству по OAuth2, и@Bean(name = "OAuth") public DataSource secondaryDataSource()...
он не был автоматически настроен и не использовалсяtestOnBorrow
.Приведенные выше предложения не сработали для меня. Что действительно сработало, так это включение следующих строк в application.properties
Вы можете найти объяснение здесь
источник
Настройка
spring.datasource.tomcat.testOnBorrow=true
в application.properties не сработала.Программные настройки, как показано ниже, работали без каких-либо проблем.
источник
Я только что перешел на Spring Boot 1.4 и обнаружил, что эти свойства были переименованы:
источник
Ответ whoami правильный. Используя предложенные свойства, я не смог заставить это работать (используя Spring Boot 1.5.3.RELEASE)
Я добавляю свой ответ, поскольку это полный класс конфигурации, поэтому он может помочь кому-то, использующему Spring Boot:
источник
У меня похожая проблема. Spring 4 и Tomcat 8. Решаю проблему с настройкой Spring.
Я тестировал. Это работает хорошо! Эти две строки делают все, чтобы повторно подключиться к базе данных:
источник
Если кто-то использует собственный источник данных
Свойства должны выглядеть следующим образом. Обратите внимание на @ConfigurationProperties с префиксом. Префикс - это все, что находится перед фактическим именем свойства.
Ссылка на Spring Version 1.4.4.RELEASE
источник
Как уже отмечалось некоторыми людьми, spring-boot 1.4+ имеет определенные пространства имен для четырех пулов соединений. По умолчанию в Spring-boot 2+ используется hikaricp. Таким образом, вам нужно будет указать здесь SQL. По умолчанию это
SELECT 1
. Вот что вам понадобится, например, для DB2:spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1
Предупреждение : если ваш драйвер поддерживает JDBC4, мы настоятельно не рекомендуем устанавливать это свойство. Это для «устаревших» драйверов, которые не поддерживают API JDBC4 Connection.isValid (). Это запрос, который будет выполнен непосредственно перед тем, как вам будет предоставлено соединение из пула, чтобы убедиться, что соединение с базой данных все еще живо. Опять же, попробуйте запустить пул без этого свойства, HikariCP регистрирует ошибку, если ваш драйвер не совместим с JDBC4, чтобы вы знали. По умолчанию: нет
источник
Для тех, кто хочет сделать это из YAML с несколькими источниками данных, есть отличное сообщение в блоге об этом: https://springframework.guru/how-to-configure-multiple-data-sources-in-a-spring-boot -применение/
В основном это говорит о том, что вам обоим нужно настроить свойства источника данных и источник данных следующим образом:
Не забываем удалить
@Primary
из других источников данных.источник