ดูเหมือนว่าคุณมีการเชื่อมต่อรั่วไหลในแอปพลิเคชันของคุณเนื่องจากไม่สามารถปิดการเชื่อมต่อร่วมกันได้ คุณไม่ได้มีปัญหาเฉพาะกับ<idle> in transaction
เซสชัน แต่มีการเชื่อมต่อโดยรวมมากเกินไป
การฆ่าการเชื่อมต่อไม่ใช่คำตอบที่ถูกต้อง แต่เป็นวิธีแก้ปัญหาชั่วคราวที่ใช้ได้
แทนที่จะเริ่ม PostgreSQL ใหม่เพื่อบูตการเชื่อมต่ออื่น ๆ ทั้งหมดจากฐานข้อมูล PostgreSQL โปรดดู: ฉันจะแยกผู้ใช้รายอื่นทั้งหมดออกจากฐานข้อมูล postgres ได้อย่างไร และจะวางฐานข้อมูล PostgreSQL ได้อย่างไรหากมีการเชื่อมต่อที่ใช้งานอยู่ . ส่วนหลังแสดงข้อความค้นหาที่ดีกว่า
สำหรับการตั้งค่าการหมดเวลาตามที่ @Doon แนะนำโปรดดูวิธีปิดการเชื่อมต่อที่ไม่ได้ใช้งานใน PostgreSQL โดยอัตโนมัติ? ซึ่งแนะนำให้คุณใช้ PgBouncer เพื่อพร็อกซีสำหรับ PostgreSQL และจัดการการเชื่อมต่อที่ไม่ได้ใช้งาน นี่เป็นความคิดที่ดีมากหากคุณมีแอปพลิเคชั่นบั๊กกี้ที่ทำให้การเชื่อมต่อรั่วไหล ฉันขอแนะนำอย่างยิ่งให้กำหนดค่า PgBouncer
keepalive TCPจะไม่ทำงานที่นี่เพราะ app จะยังคงเชื่อมต่อและมีชีวิตอยู่มันก็ไม่ควรจะเป็น
ใน PostgreSQL 9.2 ขึ้นไปคุณสามารถใช้state_change
คอลัมน์การประทับเวลาใหม่และstate
ฟิลด์pg_stat_activity
เพื่อใช้ Reaper การเชื่อมต่อที่ไม่ได้ใช้งาน ให้งาน cron ดำเนินการดังนี้:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'regress'
AND pid <> pg_backend_pid()
AND state = 'idle'
AND state_change < current_timestamp - INTERVAL '5' MINUTE;
ในเวอร์ชันเก่าคุณต้องใช้โครงร่างที่ซับซ้อนซึ่งจะติดตามเมื่อการเชื่อมต่อไม่ได้ใช้งาน อย่าลำบากเลย; เพียงแค่ใช้ pgbouncer