2015-05-26 14 views
36

Tôi có một ứng dụng có sử dụng lò xo khởi động, JPA-hiberanate với mysql.I đang nhận log lỗi nàyKết nối với Db chết sau> 4 <24 trong JPA lò xo khởi động ngủ đông

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. 

Đây là của tôi 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 

Để giải quyết vấn đề này, tôi có thể sử dụng

spring.datasource.testOnBorrow=true 
spring.datasource.validationQuery=SELECT 1 

Nhưng tôi đã kiểm tra rằng nó không phải là recommended. Vì vậy, bất kỳ ai cũng có thể đề xuất tôi nên làm gì để khắc phục lỗi này

+1

Hãy xem bài đăng sau. http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html, đây là liên kết nhận xét hấp dẫn từ http://stackoverflow.com/questions/2077081/connection-with -mysql-is-being-aborted-automaticly-how-to-configure-connector-j –

+0

@KennethClark Tôi đang sử dụng spring-boot không spring nên những thứ này sẽ không giúp ích nhiều cho tôi. Và tôi cũng không biết nhiều về mùa xuân . – Soham

+0

Khởi động mùa xuân dựa trên Spring, vì vậy nếu bạn sử dụng Spring Boot, tất nhiên bạn cũng đang sử dụng Spring. Bạn nên đọc thêm về những điều cơ bản của Spring Boot, nếu bạn không biết điều đó. – dunni

Trả lời

85

Cách dễ nhất là chỉ định thuộc tính autoReconnect trong url JDBC, mặc dù đây không phải là cách tiếp cận được khuyến nghị.

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

Điều này có thể gây ra sự cố khi bạn có kết nối đang hoạt động và trong khi xảy ra sự cố và kết nối lại sẽ xảy ra. Nó sẽ không cung cấp cho các vấn đề khi kết nối được xác nhận vào lúc bắt đầu giao dịch và một kết nối mới được mua lại ngay từ đầu.

Tuy nhiên, tốt hơn hết là bạn nên bật xác thực kết nối trong suốt thời gian tồn tại của ứng dụng. Đối với điều này, bạn có thể chỉ định several properties.

Bắt đầu đầu tiên bằng cách chỉ định số lượng kết nối tối đa bạn cho phép cho nhóm. (Đối với một đọc về xác định tối đa poolize đọc this).

spring.datasource.max-active=10 

Bạn cũng có thể muốn xác định số lượng kết nối ban đầu

spring.datasource.initial-size=5 

Tiếp theo, bạn muốn xác định min và số tối đa của kết nối nhàn rỗi.

spring.datasource.max-idle=5 
spring.datasource.min-idle=1 

Để xác thực kết nối bạn cần chỉ định truy vấn xác thực và thời điểm xác thực. Khi bạn muốn xác thực định kỳ, thay vì khi kết nối được truy xuất từ ​​nhóm (điều này để ngăn các kết nối bị hỏng trong nhóm của bạn).

spring.datasource.test-while-idle=true 
spring.datasource.test-on-borrow=true 
spring.datasource.validation-query=SELECT 1 

Bây giờ bạn cũng được xác nhận trong khi một kết nối được nhàn rỗi bạn cần phải xác định mức độ thường xuyên bạn muốn chạy truy vấn này cho các kết nối và khi một kết nối được coi là nhàn rỗi.

spring.datasource.time-between-eviction-runs-millis=5000 (this is the default) 
spring.datasource.min-evictable-idle-time-millis=60000 (this is also default) 

Tất cả điều này sẽ kích hoạt xác thực kết nối (nhàn rỗi) của bạn và khi một trường hợp ngoại lệ xảy ra hoặc thời gian rảnh đã qua kết nối của bạn sẽ bị xóa khỏi hồ bơi.

Giả sử bạn đang sử dụng JDBC Tomcat làm hồ bơi kết nối this là cách đọc hay về cấu hình.

+1

Cảm ơn @M. Deinum. Lời giải thích tuyệt vời. Xin lỗi vì đã đến trễ. Bạn đã cứu ngày của tôi. – Soham

+9

Thông tin tuyệt vời. Nên được thêm vào tài liệu khởi động mùa xuân. –

+0

Cảm ơn. Truy vấn 'validation-query' có chạy' time-between-eviction-runs-millis' OR 'min-evictable-idle-time-millis' không? – phani

Các vấn đề liên quan