คำอธิบายข้อผิดพลาดต่อไปนี้:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
สรุป:
คุณเปิดการเชื่อมต่อกับฐานข้อมูลเกินขีด จำกัด ที่อนุญาต คุณวิ่งบางอย่างเช่นนี้ภายในของวงและลืมที่จะทำงานConnection conn = myconn.Open();
conn.close();
เพียงเพราะชั้นเรียนของคุณถูกทำลายและขยะที่เก็บรวบรวมไม่ได้ปล่อยการเชื่อมต่อกับฐานข้อมูล วิธีแก้ไขที่เร็วที่สุดคือตรวจสอบให้แน่ใจว่าคุณมีรหัสต่อไปนี้กับคลาสใดก็ตามที่สร้างการเชื่อมต่อ:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
วางรหัสนั้นในคลาสใดก็ได้ที่คุณสร้าง Connection จากนั้นเมื่อชั้นเรียนของคุณถูกเก็บขยะการเชื่อมต่อของคุณจะถูกปลดปล่อย
เรียกใช้ SQL นี้เพื่อดูการเชื่อมต่อสูงสุด postgresql ที่อนุญาต:
show max_connections;
ค่าเริ่มต้นคือ 100 PostgreSQL บนฮาร์ดแวร์ที่ดีสามารถรองรับการเชื่อมต่อได้ครั้งละไม่กี่ร้อย หากคุณต้องการมีหลายพันคุณควรพิจารณาใช้ซอฟต์แวร์การรวมการเชื่อมต่อเพื่อลดค่าใช้จ่ายในการเชื่อมต่อ
ดูว่าใคร / อะไร / เมื่อใด / ที่ไหนกำลังเปิดการเชื่อมต่อของคุณ:
SELECT * FROM pg_stat_activity;
จำนวนการเชื่อมต่อที่ใช้ในปัจจุบันคือ:
SELECT COUNT(*) from pg_stat_activity;
กลยุทธ์การแก้จุดบกพร่อง
คุณสามารถให้ชื่อผู้ใช้ / รหัสผ่านที่แตกต่างกันให้กับโปรแกรมที่อาจไม่ปล่อยการเชื่อมต่อเพื่อค้นหาว่ามันคือชื่อใดจากนั้นดูใน pg_stat_activity เพื่อดูว่าอันไหนไม่ได้ถูกล้างออก
ทำการติดตามสแต็กข้อยกเว้นเต็มรูปแบบเมื่อไม่สามารถสร้างการเชื่อมต่อและทำตามรหัสสำรองไปยังตำแหน่งที่คุณสร้างใหม่Connection
ตรวจสอบให้แน่ใจว่าทุกบรรทัดรหัสที่คุณสร้างการเชื่อมต่อลงท้ายด้วยconnection.close();
วิธีตั้งค่า max_connections ให้สูงขึ้น:
max_connections ใน postgresql.conf ตั้งค่าจำนวนสูงสุดของการเชื่อมต่อพร้อมกันไปยังเซิร์ฟเวอร์ฐานข้อมูล
- ขั้นแรกให้ค้นหาไฟล์ postgresql.conf ของคุณ
- หากคุณไม่ทราบว่าอยู่ที่ไหนให้ค้นหาฐานข้อมูลด้วย sql:
SHOW config_file;
- เหมืองอยู่ใน:
/var/lib/pgsql/data/postgresql.conf
- ล็อกอินด้วยรูทและแก้ไขไฟล์นั้น
- ค้นหาสตริง: "max_connections"
max_connections=100
คุณจะเห็นบรรทัดที่ระบุว่า
- กำหนดจำนวนให้ใหญ่ขึ้นตรวจสอบขีด จำกัด สำหรับเวอร์ชัน postgresql ของคุณ
- รีสตาร์ทฐานข้อมูล postgresql เพื่อให้การเปลี่ยนแปลงมีผล
max_connections สูงสุดคือเท่าใด
ใช้แบบสอบถามนี้:
select min_val, max_val from pg_settings where name='max_connections';
ฉันได้รับคุณค่าตาม8388607
ทฤษฎีแล้วนั่นคือสิ่งที่มากที่สุดที่คุณได้รับอนุญาต แต่แล้วกระบวนการที่หลบหนีสามารถกินการเชื่อมต่อหลายพันครั้งและแปลกใจฐานข้อมูลของคุณไม่ตอบสนองจนกว่าจะรีบูต หากคุณมี max_connections ที่สมเหตุสมผลเช่น 100 โปรแกรมที่กระทำผิดจะถูกปฏิเสธการเชื่อมต่อใหม่