org.postgresql.util.PSQLException: FATAL: üzgünüm, zaten çok fazla istemci var


93

Bir Postgresql veritabanına bağlanmaya çalışıyorum, aşağıdaki Hatayı alıyorum:

Hata: org.postgresql.util.PSQLException: FATAL: üzgünüm, zaten çok fazla istemci

Hata ne anlama geliyor ve nasıl düzeltebilirim?

Dosyam server.propertiesşu:

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

Yanıtlar:


39

Biz bilmiyoruz server.properties dosyası bu, biz ne biliyor olduğunu SimocoPoolSize araçlar (öyle mi?)

Bazı özel veritabanı bağlantıları havuzunu kullandığınızı varsayalım. O halde, sanırım sorun, havuzunuzun 100 veya 120 bağlantı açacak şekilde yapılandırılmış olması, ancak Postgresql sunucunuzun kabul edecek şekilde yapılandırılmış olmasıdır MaxConnections=90. Bunlar çelişkili ayarlar gibi görünüyor. Arttırmayı deneyin MaxConnections=120.

Ama önce db katman altyapınızı anlamalı, havuzda gerçekten çok fazla açık bağlantıya ihtiyacınız varsa, hangi havuzu kullandığınızı bilmelisiniz. Ve özellikle, açık bağlantıları havuza zarif bir şekilde iade ediyorsanız


168

Aşağıdaki hatanın açıklaması:

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

Özet:

Veritabanına izin verilen bağlantı sınırından daha fazlasını açtınız. Bunun gibi bir şey koştunuz: Connection conn = myconn.Open();bir döngünün içinde ve koşmayı unuttunuz conn.close();. Sırf sınıfınızın yok edilmesi ve çöplerin toplanması, veritabanına olan bağlantıyı serbest bırakmaz. Bunun en hızlı çözümü, bağlantı oluşturan sınıf ne olursa olsun aşağıdaki koda sahip olduğunuzdan emin olmaktır:

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

Bu kodu, Bağlantı oluşturduğunuz herhangi bir sınıfa yerleştirin. Daha sonra sınıfınız çöp toplandığında bağlantınız kesilecektir.

İzin verilen postgresql maks. Bağlantılarını görmek için bu SQL'i çalıştırın:

show max_connections;

Varsayılan değer 100'dür. İyi bir donanımda PostgreSQL bir seferde birkaç yüz bağlantıyı destekleyebilir. Binlerce kişiye sahip olmak istiyorsanız, bağlantı yükünü azaltmak için bağlantı havuzu yazılımını kullanmayı düşünmelisiniz.

Bağlantılarınızı tam olarak kimin / ne / ne zaman / nerede açık tuttuğuna bir göz atın:

SELECT * FROM pg_stat_activity;

Şu anda kullanılan bağlantı sayısı:

SELECT COUNT(*) from pg_stat_activity;

Hata ayıklama stratejisi

  1. Hangisi olduğunu bulmak için bağlantıları serbest bırakmayan programlara farklı kullanıcı adları / şifreler verebilir ve ardından hangisinin kendisinden sonra temizlenmediğini bulmak için pg_stat_activity'ye bakabilirsiniz.

  2. Bağlantılar oluşturulamadığında tam bir istisna yığını izleme yapın ve yeni bir kod oluşturduğunuz yere kadar kodu takip edin, bağlantı oluşturduğunuz Connectionher kod satırının birconnection.close();

Max_connections nasıl daha yükseğe ayarlanır:

postgresql.conf dosyasındaki max_connections, veritabanı sunucusuna maksimum eşzamanlı bağlantı sayısını belirler.

  1. Önce postgresql.conf dosyanızı bulun
  2. Nerede olduğunu bilmiyorsanız, veritabanını sql ile sorgulayın: SHOW config_file;
  3. Benimki: /var/lib/pgsql/data/postgresql.conf
  4. Kök olarak oturum açın ve bu dosyayı düzenleyin.
  5. "Max_connections" dizesini arayın.
  6. Yazan bir satır göreceksiniz max_connections=100.
  7. Bu sayıyı büyütün, postgresql sürümünüzün sınırını kontrol edin.
  8. Değişikliklerin etkili olması için postgresql veritabanını yeniden başlatın.

Maksimum bağlantı sayısı nedir?

Bu sorguyu kullanın:

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

Değeri anlıyorum 8388607, teoride sahip olmanıza izin verilen en fazla şey bu, ancak daha sonra kaçak bir süreç binlerce bağlantıyı tüketebilir ve şaşırtıcı, veritabanınız yeniden başlatılıncaya kadar yanıt vermiyor. Eğer 100 gibi mantıklı bir max_connections'ınız olsaydı. Sorun yaratan programın yeni bir bağlantısı reddedilirdi.


4
neden bazı insanlar ';' SQL ifadelerinden sonra ?! Sürükleyip kopyalayıp yapıştırır :)
kod sunucusu

@codervince Dikkat etmeniz gerekiyor. Kopyala + yapıştır yerine komutları yazmanız gerektiğini söyleyecek kadar ileri gidecektim.
AVProgrammer

4

MaxConnections & InitialConnections'ı artırmaya gerek yok. İşinizi yaptıktan sonra bağlantılarınızı kapatın. Örneğin, bağlantı oluşturuyorsanız:

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

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

İşinizi yakın bağlantı yaptıktan sonra:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

11
Son blokta bağlantıları her zaman kapatın! Aksi takdirde, bir hata oluşursa bağlantı açık kalır.
tine2k

1

Soruna neden olan satırlar şunlardır:

MaxConnections=90
InitialConnections=80

Daha fazla bağlantıya izin vermek için değerleri artırabilirsiniz.


4
Ve daha fazla bağlantınız olacaksa, artan bağlantılarla hizalamak için bellek parametrelerini ayarlayın.
Kuberchaun

0

Örneğin, tüm bağlantılarınızı kapatmanız gerekir: Eğer bir INSERT INTO ifadesi yaparsanız, ifadeyi ve bağlantınızı şu şekilde kapatmanız gerekir:

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

Ve bir SELECT ifadesi yaparsanız, ifadeyi, bağlantıyı ve sonuç kümesini şu şekilde kapatmanız gerekir:

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

Bunu yaptım ve işe yaradı

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.