Giải thích về lỗi sau:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Tóm lược:
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ư thế này: Connection conn = myconn.Open();
bên trong một 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 đến 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;
Giá trị 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 cân nhắc sử dụng phần mềm gộ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à cái nào, sau đó tìm trong pg_stat_activity để tìm cái nào không được dọn dẹp sau chính nó.
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 mới Connection
, đảm bảo mọi dòng mã nơi bạn tạo kết nối 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 là 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ố tiền nhiều nhất bạn được phép có, nhưng sau đó một quá trình chạy trốn có thể ăn 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.