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

93

Saya mencoba terhubung ke database Postgresql, saya mendapatkan Error berikut:

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

Apa arti kesalahan tersebut dan bagaimana cara memperbaikinya?

server.propertiesFile saya adalah sebagai berikut:

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1
lakshmi
sumber

Jawaban:

39

Kami tidak tahu apa itu file server.properties , kami juga tidak tahu apa arti SimocoPoolSize (apakah Anda?)

Mari tebak Anda menggunakan beberapa kumpulan koneksi database kustom. Kemudian, saya kira masalahnya adalah bahwa kumpulan Anda dikonfigurasi untuk membuka 100 atau 120 koneksi, tetapi server Postgresql Anda dikonfigurasi untuk menerima MaxConnections=90. Ini tampaknya pengaturan yang bertentangan. Coba tingkatkan MaxConnections=120.

Tetapi Anda harus terlebih dahulu memahami infrastruktur lapisan db Anda, mengetahui kumpulan apa yang Anda gunakan, jika Anda benar-benar membutuhkan begitu banyak koneksi terbuka di kolam tersebut. Dan, khususnya, jika Anda dengan anggun mengembalikan koneksi yang terbuka ke kolam

leonbloy.dll
sumber
168

Penjelasan dari kesalahan berikut:

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

Ringkasan:

Anda membuka lebih dari batas yang diizinkan untuk koneksi ke database. Anda menjalankan sesuatu seperti ini: Connection conn = myconn.Open();di dalam satu lingkaran, dan lupa untuk menjalankan conn.close();. Hanya karena kelas Anda dihancurkan dan sampah 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 saat kelas Anda dikumpulkan sampah, koneksi Anda akan dilepaskan.

Jalankan SQL ini untuk melihat koneksi max postgresql diperbolehkan:

show max_connections;

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

Lihatlah siapa / apa / kapan / di mana yang menahan 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, dan kemudian mencari di pg_stat_activity untuk mencari tahu mana yang tidak membersihkan setelah itu sendiri.

  2. Lakukan pelacakan tumpukan pengecualian penuh ketika koneksi tidak dapat dibuat dan ikuti kode kembali ke tempat Anda membuat yang baru Connection, pastikan setiap baris kode tempat Anda membuat koneksi diakhiri denganconnection.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 itu, kueri database dengan sql: SHOW config_file;
  3. Milik saya ada di: /var/lib/pgsql/data/postgresql.conf
  4. Login sebagai root dan edit file itu.
  5. Cari string: "max_connections".
  6. Anda akan melihat baris yang bertuliskan max_connections=100.
  7. Tetapkan angka itu lebih besar, periksa batas untuk 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 nilainya 8388607, secara teori itulah jumlah maksimal yang boleh Anda miliki, tetapi kemudian proses yang tidak berjalan dapat memakan ribuan koneksi, dan mengejutkan, database Anda tidak responsif hingga reboot. Jika Anda memiliki max_connections yang masuk akal seperti 100. Program yang melanggar akan ditolak koneksi baru.

Eric Leschinski
sumber
4
mengapa beberapa orang melupakan ';' setelah pernyataan SQL ?! Membuat salin dan tempel menjadi menarik :)
kode sejak
@codervince Anda harus memperhatikan. Saya hampir pergi sejauh mengatakan Anda harus mentranskripsikan perintah daripada salin + tempel.
AVProgrammer
4

Tidak perlu meningkatkan MaxConnections & InitialConnections. Tutup saja koneksi Anda setelah melakukan pekerjaan Anda. Misalnya jika Anda membuat koneksi:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

Setelah melakukan pekerjaan Anda, koneksi dekat:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}
JK Tomar
sumber
11
Selalu tutup koneksi di blok terakhir! Jika tidak, koneksi tetap terbuka jika terjadi kesalahan.
tine2k
1

Garis yang menyinggung adalah sebagai berikut:

MaxConnections=90
InitialConnections=80

Anda dapat meningkatkan nilai untuk memungkinkan lebih banyak koneksi.

Delan Azabani
sumber
4
Dan jika Anda akan memiliki lebih banyak koneksi diperbolehkan menyesuaikan parameter memori juga untuk menyelaraskan dengan peningkatan koneksi.
Kuberchaun
0

Anda harus menutup semua koneksi Anda misalnya: Jika Anda membuat pernyataan INSERT INTO, Anda harus menutup pernyataan dan koneksi Anda dengan cara ini:

statement.close();
Connexion.close():

Dan jika Anda membuat pernyataan SELECT Anda perlu menutup pernyataan, hubungan dan kumpulan hasil dengan cara ini:

resultset.close();
statement.close();
Connexion.close();

Saya melakukan ini dan berhasil

Brayan Escobedo
sumber