Trong thuộc tính cấu hình của mình, bạn đã sử dụng thuộc tính c3p0 maxIdleTime, nhưng thuộc tính c3p0 được định cấu hình bằng c3p0.
tiền tố hoặc hibernate.c3p0.
. Lưu ý rằng bật bất kỳ c3p0
nào thuộc tính tự động kích hoạt nhà cung cấp kết nối tương ứng bằng phương pháp hibernate heuristics. Trong nhật ký không thấy rằng bạn đang sử dụng c3p0. Nếu bạn chưa định cấu hình nguồn dữ liệu thì Hibernate sẽ sử dụng hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
. Nhà cung cấp kết nối này tích hợp sẵn nhóm kết nối thô sơ mà bạn có thể đặt hibernate.connection.pool_size
, nhưng nó chỉ được sử dụng cho các mục đích phát triển. Không bao giờ sử dụng nó trong môi trường sản xuất.
Bạn có thể thảo luận bất tận về chủ đề Cách sửa java.net.SocketException:Broken pipe . Sau một thời gian, bạn sẽ nhận ra rằng bạn vẫn mở kết nối trong pool đột ngột bị đóng ở phía bên kia bởi những lý do sau:
- Tường lửa hoặc bộ định tuyến có thể chặn các kết nối không hoạt động (giao thức máy khách / máy chủ MySQL không hoạt động).
- Máy chủ MySQL có thể đang đóng các kết nối không hoạt động vượt quá
wait_timeout
hoặcinteractive_timeout
ngưỡng cửa.
Để giúp khắc phục những sự cố này, bạn có thể sử dụng các mẹo sau:
- Phiên bản trình điều khiển JDBC (5.1.13+) gần đây được sử dụng.
- Đảm bảo rằng
wait_timeout
vàinteractive_timeout
được đặt đủ cao. Kiểm tra xeminteractiveClient
được sử dụng. - Đảm bảo rằng
tcpKeepalive
được bật. - Đảm bảo rằng mọi cài đặt thời gian chờ của bộ định tuyến hoặc tường lửa có thể định cấu hình đều cho phép thời gian chờ kết nối dự kiến tối đa.
- Đảm bảo các kết nối hợp lệ khi được sử dụng từ nhóm kết nối. Sử dụng truy vấn bắt đầu bằng
/* ping */
để thực hiện một ping nhẹ thay vì truy vấn đầy đủ. Lưu ý, cú pháp của ping cần phải chính xác như được chỉ định ở đây. - Xác thực rõ ràng kết nối trước khi sử dụng nếu kết nối không hoạt động trong một thời gian dài.
- Giảm thiểu thời lượng đối tượng kết nối không hoạt động trong khi logic ứng dụng khác được thực thi.
Để tuân thủ một số tùy chọn này, bạn nên sử dụng nhóm kết nối mà bạn có thể sử dụng với Hibernate. Hibernate có hỗ trợ commons-dbcp, c3p0 và proxool. Ngoài ra, bạn có thể cấu hình nguồn dữ liệu JNDI trên máy chủ web để sử dụng với chế độ ngủ đông, nó có một nhóm kết nối. Xem Chương 7 Tổng hợp kết nối với Trình kết nối / J .
Nếu bạn muốn định cấu hình Hibernate với c3p0, bạn nên đọc Cách định cấu hình nhóm kết nối C3P0 . Đối với cấu hình ví dụ dbcp, bạn nên kiểm tra bài đăng này MySQL, Hibernate và Broken Pipe Exception . Bạn sẽ sử dụng kết nối nào là tùy thuộc vào bạn.