Giải thích về lỗi sau:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Tóm tắt:
Bạn đã mở nhiều hơn giới hạn cho phép của kết nối với cơ sở dữ liệu. Bạn đã chạy một cái gì đó như sau:Connection conn = myconn.Open();
bên trong vòng lặp và quên chạy conn.close();
. Chỉ vì lớp của bạn bị phá hủy và rác được thu thập không giải phóng kết nối với cơ sở dữ liệu. Cách khắc phục nhanh nhất cho vấn đề này là đảm bảo bạn có mã sau với bất kỳ lớp nào tạo kết nối:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
Đặt mã đó vào bất kỳ lớp nào bạn tạo Kết nối. Sau đó, khi lớp của bạn được thu gom rác, kết nối của bạn sẽ được giải phóng.
Chạy SQL này để xem các kết nối tối đa postgresql được phép:
show max_connections;
Mặc định là 100. PostgreSQL trên phần cứng tốt có thể hỗ trợ vài trăm kết nối cùng một lúc. Nếu bạn muốn có hàng nghìn, bạn nên xem xét sử dụng phần mềm tổng hợp kết nối để giảm chi phí kết nối.
Hãy xem chính xác ai / cái gì / khi nào / ở đâu đang mở các kết nối của bạn:
SELECT * FROM pg_stat_activity;
Số lượng kết nối hiện được sử dụng là:
SELECT COUNT(*) from pg_stat_activity;
Chiến lược gỡ lỗi
-
Bạn có thể cung cấp các tên người dùng / mật khẩu khác nhau cho các chương trình có thể không giải phóng kết nối để tìm ra nó là chương trình nào, sau đó xem trong pg_stat_activity để tìm ra chương trình nào không tự dọn dẹp.
-
Thực hiện theo dõi ngăn xếp ngoại lệ đầy đủ khi không thể tạo kết nối và theo dõi mã sao lưu đến nơi bạn tạo
Connection
mới , hãy đảm bảo mọi dòng mã nơi bạn tạo kết nối đều kết thúc bằngconnection.close();
Cách đặt max_connections cao hơn:
max_connections trong postgresql.conf đặt số lượng tối đa các kết nối đồng thời đến máy chủ cơ sở dữ liệu.
- Trước tiên, hãy tìm tệp postgresql.conf của bạn
- Nếu bạn không biết nó ở đâu, hãy truy vấn cơ sở dữ liệu bằng sql:
SHOW config_file;
- Của tôi nằm trong:
/var/lib/pgsql/data/postgresql.conf
- Đăng nhập với tư cách người chủ và chỉnh sửa tệp đó.
- Tìm kiếm chuỗi:"max_connections".
- Bạn sẽ thấy một dòng cho biết
max_connections=100
. - Đặt con số đó lớn hơn, kiểm tra giới hạn cho phiên bản postgresql của bạn.
- Khởi động lại cơ sở dữ liệu postgresql để các thay đổi có hiệu lực.
max_connections tối đa là bao nhiêu?
Sử dụng truy vấn này:
select min_val, max_val from pg_settings where name='max_connections';
Tôi nhận được giá trị 8388607
, về lý thuyết thì đó là số lượng nhiều nhất bạn được phép có, nhưng sau đó một quá trình chạy trốn có thể tiêu thụ hàng nghìn kết nối và thật ngạc nhiên, cơ sở dữ liệu của bạn không phản hồi cho đến khi khởi động lại. Nếu bạn có max_connections hợp lý như 100. Chương trình vi phạm sẽ bị từ chối kết nối mới.