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
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.
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.
- Pertama temukan file postgresql.conf Anda
- Jika Anda tidak tahu di mana itu, kueri database dengan sql:
SHOW config_file;
- Milik saya ada di:
/var/lib/pgsql/data/postgresql.conf
- Login sebagai root dan edit file itu.
- Cari string: "max_connections".
- Anda akan melihat baris yang bertuliskan
max_connections=100
.
- Tetapkan angka itu lebih besar, periksa batas untuk versi postgresql Anda.
- 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.
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(); }
sumber
Garis yang menyinggung adalah sebagai berikut:
MaxConnections=90 InitialConnections=80
Anda dapat meningkatkan nilai untuk memungkinkan lebih banyak koneksi.
sumber
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
sumber