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

Соединение с Db умирает после> 4 <24 в spring -boot jpa hibernate

У меня есть приложение, которое использует 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.

Вот мои application.properties

# 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

Но я проверил, что это не рекомендуется. Кто-нибудь может предложить мне, что мне делать, чтобы преодолеть эту ошибку.

4b9b3361

Ответ 1

Самый простой способ - указать свойство autoReconnect в URL-адресе JDBC, хотя это не рекомендуется.

spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true

Это может привести к проблемам при активном подключении, а во время транзакции произойдет что-то, и произойдет повторное подключение. Он не будет давать проблем, когда подключение будет подтверждено в начале транзакции, и новое соединение будет приобретено с самого начала.

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

Сначала запустите, указав максимальное количество подключений, которое вы разрешаете для пула. (Для ознакомления с определением максимального количества пустых значений прочтите this).

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 в качестве пула соединений this, вам приятно читать, что и как настроить.