Nhìn chung, bạn đang đi đúng hướng và phân tích của bạn có vẻ chính xác. Một số nhận xét:
Tùy chọn 2 (loại bỏ vật lưu trữ) sẽ giúp loại bỏ các kết nối không hoạt động trong nhóm Npgsql đã bị hỏng. Như bạn đã viết, ứng dụng của bạn vẫn sẽ gặp một số lỗi (vì một số kết nối không hoạt động kém có thể không được gỡ bỏ kịp thời). Không có lý do cụ thể nào để nghĩ rằng điều này sẽ gây ra thêm vấn đề - điều này sẽ khá an toàn để bật.
Tùy chọn 3 thực sự có vấn đề đối với hiệu suất, vì kết nối TCP tới pgbouncer sẽ phải được thiết lập mỗi khi cần kết nối cơ sở dữ liệu. Nó cũng sẽ không cung cấp cơ chế chống lỗi 100%, vì pgbouncer vẫn có thể bị rớt ra khi đang sử dụng kết nối.
Vào cuối ngày, bạn đang hỏi về khả năng phục hồi khi đối mặt với sự cố mạng / máy chủ tùy ý, đây không phải là điều dễ dàng đạt được. Cách duy nhất đáng tin cậy 100% để giải quyết vấn đề này là trong ứng dụng của bạn, thông qua một lớp chuyên dụng sẽ thử lại các hoạt động khi một ngoại lệ tạm thời xảy ra. Bạn có thể muốn xem Polly
và lưu ý rằng Npgsql sẽ giúp chúng ta một chút bằng cách tiết lộ một IsTransient
ngoại lệ có thể được sử dụng như một kích hoạt để thử lại (Entity Framework Core cũng bao gồm một "chiến lược thử lại" tương tự). Nếu bạn đi theo con đường này, hãy lưu ý rằng các giao dịch đặc biệt khó xử lý chính xác.