PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

org.postgresql.util.PSQLException:FATAL:maaf, sudah terlalu banyak klien

Penjelasan tentang kesalahan berikut:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Ringkasan:

Anda membuka lebih dari batas koneksi yang diizinkan ke database. Anda menjalankan sesuatu seperti ini:Connection conn = myconn.Open(); di dalam loop, dan lupa menjalankan conn.close(); . Hanya karena kelas Anda dihancurkan dan sampah yang dikumpulkan tidak melepaskan koneksi ke database. Perbaikan tercepat untuk ini adalah memastikan Anda memiliki kode berikut dengan kelas apa pun yang membuat koneksi:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

Tempatkan kode itu di kelas mana pun tempat Anda membuat Koneksi. Kemudian ketika kelas Anda telah dikumpulkan, koneksi Anda akan dilepaskan.

Jalankan SQL ini untuk melihat koneksi maksimal postgresql yang diizinkan:

show max_connections;

Standarnya adalah 100. PostgreSQL pada perangkat keras yang baik dapat mendukung beberapa ratus koneksi sekaligus. Jika Anda ingin memiliki ribuan, Anda harus mempertimbangkan untuk menggunakan perangkat lunak penyatuan koneksi untuk mengurangi overhead koneksi.

Lihat dengan tepat siapa/apa/kapan/di mana membuka koneksi Anda:

SELECT * FROM pg_stat_activity;

Jumlah koneksi yang saat ini digunakan adalah:

SELECT COUNT(*) from pg_stat_activity;

Strategi debug

  1. Anda dapat memberikan nama pengguna/kata sandi yang berbeda ke program yang mungkin tidak melepaskan koneksi untuk mengetahui yang mana itu, dan kemudian mencari di pg_stat_activity untuk mengetahui mana yang tidak dibersihkan setelahnya.

  2. Lakukan pelacakan tumpukan pengecualian penuh ketika koneksi tidak dapat dibuat dan ikuti kode kembali ke tempat Anda membuat Connection baru , pastikan setiap baris kode tempat Anda membuat koneksi diakhiri dengan connection.close();

Cara menyetel max_connections lebih tinggi:

max_connections di postgresql.conf menetapkan jumlah maksimum koneksi bersamaan ke server database.

  1. Pertama temukan file postgresql.conf Anda
  2. Jika Anda tidak tahu di mana letaknya, kueri database dengan sql:SHOW config_file;
  3. Milik saya ada di:/var/lib/pgsql/data/postgresql.conf
  4. Masuk sebagai root dan edit file tersebut.
  5. Telusuri string:"max_connections".
  6. Anda akan melihat baris yang mengatakan max_connections=100 .
  7. Setel angka itu lebih besar, periksa batas versi postgresql Anda.
  8. Mulai ulang database postgresql agar perubahan diterapkan.

Berapa max_connections maksimum?

Gunakan kueri ini:

select min_val, max_val from pg_settings where name='max_connections';

Saya mendapatkan nilai 8388607 , secara teori itulah yang paling Anda boleh miliki, tetapi kemudian proses pelarian dapat memakan ribuan koneksi, dan mengejutkan, database Anda tidak responsif sampai reboot. Jika Anda memiliki max_connections yang masuk akal seperti 100. Program yang melanggar akan ditolak untuk mendapatkan koneksi baru.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Daftar fungsi tersimpan yang mereferensikan tabel di PostgreSQL

  2. KUNCI UTAMA Gabungan memberlakukan batasan NOT NULL pada kolom yang terlibat

  3. Migrasi Rails:Bigint di PostgreSQL tampaknya gagal?

  4. mengakses alias kolom di klausa where di postgresql

  5. postgresql date_trunc ke presisi sewenang-wenang?