Соединение с Db прекращается после>4<24 в спящем режиме загрузки jpa
У меня есть приложение, которое использует spring-boot,jpa-hiberanate с mysql. Я получаю этот журнал ошибок
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,006,037 milliseconds ago. The last packet sent successfully to the server was 56,006,037 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
Вот мое приложение. Свойства
# DataSource settings: set here configurations for the database connection
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = test
spring.datasource.password = test
spring.datasource.driverClassName = com.mysql.jdbc.Driver
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate settings are prefixed with spring.jpa.hibernate.*
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
Для решения этой проблемы я могу использовать
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1
Но я проверил, что это не рекомендуется. Так может кто-нибудь предложить мне, что мне делать, чтобы преодолеть эту ошибку
1 ответ
Самый простой способ - указать autoReconnect
свойство в URL JDBC, хотя это не рекомендуемый подход.
spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true
Это может вызвать проблемы, когда у вас есть активное соединение, и во время транзакции что-то происходит, и произойдет переподключение. Это не вызовет проблем, когда соединение проверяется в начале транзакции, а новое соединение устанавливается в начале.
Однако, вероятно, лучше включить проверку ваших соединений в течение всего времени жизни вашего приложения. Для этого вы можете указать несколько свойств.
Сначала начните с указания максимального количества подключений, которые вы разрешаете для пула. (Для чтения по определению максимального размера пула прочитайте это).
spring.datasource.max-active=10
Вы также можете указать количество начальных подключений.
spring.datasource.initial-size=5
Далее вы хотите указать минимальное и максимальное количество незанятых соединений.
spring.datasource.max-idle=5
spring.datasource.min-idle=1
Для проверки соединения необходимо указать запрос проверки и время проверки. Поскольку вы хотите периодически проверять, а не когда соединение извлекается из пула (это предотвращает разрыв соединений в вашем пуле).
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1
Теперь, когда вы также проверяете во время простоя соединения, вам нужно указать, как часто вы хотите выполнять этот запрос для соединений и когда соединение считается незанятым.
spring.datasource.time-between-eviction-runs-millis=5000 (this is the default)
spring.datasource.min-evictable-idle-time-millis=60000 (this is also default)
Все это должно инициировать проверку ваших (незанятых) соединений, и, когда произойдет исключение или пройдет период простоя, ваши соединения будут удалены из пула.
Предполагая, что вы используете Tomcat JDBC в качестве пула соединений, это хорошее чтение о том, что и как настраивать.