1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
Saya melihat banyak dari mereka. Kami mencoba memperbaiki kebocoran koneksi kami. Namun sementara itu, kami ingin menyetel waktu tunggu untuk koneksi yang tidak aktif ini, mungkin maks hingga 5 menit.
postgresql
database-connection
pengguna1012451
sumber
sumber
socketTimeout
dari doc sepertinya ini menutup koneksi ke DB, seluruhnya. Saya mencoba menutup setiap idle, dan penghitung dimulai segera setelah koneksi dibuat.<IDLE> in transaction
sesi, membiarkan sesi berjalan tetapi dalam<IDLE>
status? Dengan kata lain, hentikan transaksi tetapi tidak sesinya? (Suara negatif: pertanyaan tidak jelas)idle
selamanya, kami bertanya apakah kami dapat mengatur waktu tunggu pada setiap koneksi / sesi (sejujurnya saya tidak tahu terminologi yang benar, maaf). Jika transaksi memerlukan waktu 5 menit untuk aplikasi web normal, pasti ada sesuatu yang salah ....Jawaban:
Sepertinya Anda mengalami kebocoran koneksi dalam aplikasi Anda karena gagal menutup koneksi yang dikumpulkan . Anda tidak hanya mengalami masalah dengan
<idle> in transaction
sesi, tetapi dengan terlalu banyak koneksi secara keseluruhan.Membunuh koneksi bukanlah jawaban yang tepat untuk itu, tetapi ini adalah solusi sementara yang OK-ish.
Daripada memulai kembali PostgreSQL untuk mem-boot semua koneksi lain dari database PostgreSQL, lihat: Bagaimana cara melepaskan semua pengguna lain dari database postgres? dan Bagaimana cara menjatuhkan database PostgreSQL jika ada koneksi aktif ke sana? . Yang terakhir menunjukkan kueri yang lebih baik.
Untuk mengatur waktu tunggu, seperti yang disarankan @Doon, lihat Bagaimana cara menutup koneksi yang tidak aktif di PostgreSQL secara otomatis? , yang menyarankan Anda untuk menggunakan PgBouncer sebagai proxy untuk PostgreSQL dan mengelola koneksi yang tidak aktif. Ini adalah ide yang sangat bagus jika Anda memiliki aplikasi buggy yang tetap saja membocorkan koneksi; Saya sangat menyarankan mengonfigurasi PgBouncer.
Sebuah keepalive TCP tidak akan melakukan pekerjaan di sini, karena aplikasi masih terhubung dan hidup, itu hanya tidak seharusnya.
Di PostgreSQL 9.2 dan yang lebih baru, Anda dapat menggunakan
state_change
kolom stempel waktu baru danstate
bidangpg_stat_activity
untuk mengimplementasikan mesin penuai koneksi idle. Minta cron job menjalankan sesuatu seperti ini: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;
Dalam versi yang lebih lama Anda perlu mengimplementasikan skema rumit yang melacak kapan koneksi menganggur. Jangan ganggu; gunakan saja pgbouncer.
sumber
idle
. mengapa saya harus menutupnya.Di PostgreSQL 9.6, ada opsi baru
idle_in_transaction_session_timeout
yang akan menyelesaikan apa yang Anda gambarkan. Anda dapat mengaturnya menggunakanSET
perintah, misalnya:SET SESSION idle_in_transaction_session_timeout = '5min';
sumber
SET SESSION
hanya untuk sesi saat ini (ini akan kembali ke default setelah Anda membuka koneksi baru). Anda juga dapat menyetel parameter konfigurasi pada tingkat database menggunakan misalnyaALTER DATABASE SET idle_in_transaction_session_timeout = '5min'
, atau menggunakan file konfigurasi (lihat postgresql.org/docs/current/static/config-setting.html ).Di PostgreSQL 9.1, koneksi idle dengan kueri berikut. Ini membantu saya untuk menangkal situasi yang memerlukan restart database. Ini sebagian besar terjadi dengan koneksi JDBC dibuka dan tidak ditutup dengan benar.
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE current_query = '<IDLE>' AND now() - query_start > '00:10:00';
sumber
jika Anda menggunakan postgresql 9.6+, maka di postgresql.conf Anda dapat mengatur
idle_in_transaction_session_timeout = 30000
(mdet)sumber
Solusi yang memungkinkan untuk mengaktifkan batas waktu sesi database tanpa tugas terjadwal eksternal adalah dengan menggunakan ekstensi pg_timeout yang telah saya kembangkan .
sumber