Như tôi đã nhận xét trước đây, đó là do các ổ cắm đang mở và được kết nối với cơ sở dữ liệu không nhận ra kết nối đã bị mất, vì vậy chúng vẫn kết nối cho đến khi hết thời gian chờ ổ cắm hệ điều hành được kích hoạt, tôi đọc có thể thường trong khoảng 30 phút .
Để giải quyết vấn đề, bạn cần ghi đè Thời gian chờ của ổ cắm trong Chuỗi kết nối JDBC của bạn hoặc trong Cấu hình / Thuộc tính của JDNI COnnection để xác định socketTimeout tham số thành một thời gian nhỏ hơn.
Hãy nhớ rằng bất kỳ kết nối nào dài hơn giá trị đã xác định sẽ bị ngắt, ngay cả khi nó đang được sử dụng (Tôi không thể xác nhận điều này, đó là những gì tôi đã đọc).
Hai tham số khác mà tôi đề cập trong nhận xét của mình là connectTimeout và autoReconnect .
Đây là Chuỗi kết nối JDBC của tôi:
jdbc:(...)&connectTimeout=15000&socketTimeout=60000&autoReconnect=true
Tôi cũng đã tắt bộ nhớ cache DNS của Java bằng cách thực hiện
java.security.Security.setProperty("networkaddress.cache.ttl" , "0");
java.security.Security.setProperty("networkaddress.cache.negative.ttl" , "0");
Tôi làm điều này vì Java không tôn trọng TTL và khi quá trình chuyển đổi dự phòng diễn ra, DNS vẫn giống nhau nhưng IP thay đổi.
Vì bạn đang sử dụng Máy chủ ứng dụng, các tham số để tắt bộ đệm DNS phải được chuyển cho JVM khi khởi động glassfish với -Dnet chứ không phải chính ứng dụng.