web-dev-qa-db-ja.com

org.postgresql.util.PSQLException:致命的:申し訳ありませんが、すでにクライアントが多すぎます

Postgresqlデータベースに接続しようとしていますが、次のエラーが表示されます。

エラー:org.postgresql.util.PSQLException:FATAL:すみません、クライアントが多すぎます

エラーの意味と修正方法を教えてください。

僕の server.propertiesファイルは次のとおりです。

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
69
lakshmi

server.propertiesファイルが何であるかわかりません。SimocoPoolSizeが何を意味するかもわかりません

データベース接続のカスタムプールを使用していると仮定しましょう。次に、問題は、プールが100または120接続を開くように構成されているが、PostgresqlサーバーがMaxConnections=90を受け入れるように構成されていることだと思います。これらは矛盾する設定のようです。 MaxConnections=120を増やしてみてください。

ただし、プールで非常に多くのオープン接続が本当に必要な場合は、まずデータベース層インフラストラクチャを理解し、使用しているプールを把握する必要があります。そして、特に、開いている接続をプールに正常に戻す場合

28
leonbloy

次のエラーの説明:

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

概要:

データベースへの接続の許可された制限を超えて開きました。次のようなものを実行しました:Connection conn = myconn.Open();ループ内で、conn.close();の実行を忘れました。クラスが破棄され、ガベージコレクションが行われたからといって、データベースへの接続が解放されるわけではありません。これに対する最も簡単な修正方法は、接続を作成するクラスに次のコードがあることを確認することです。

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

接続を作成するクラスにそのコードを配置します。その後、クラスがガベージコレクションされると、接続が解放されます。

このSQLを実行して、許可されているpostgresqlの最大接続数を確認します:

show max_connections;

デフォルトは100です。良好なハードウェア上のPostgreSQLは、一度に数百の接続をサポートできます。数千に増やしたい場合は、接続プーリングソフトウェアを使用して接続オーバーヘッドを削減することを検討してください。

誰が/何/いつ/どこであなたの接続を開いているかを正確に見てください:

SELECT * FROM pg_stat_activity;

現在使用されている接続の数は:

SELECT COUNT(*) from pg_stat_activity;

デバッグ戦略

  1. 接続を解放していない可能性のあるプログラムに別のユーザー名/パスワードを与えて、接続を見つけてから、pg_stat_activityを調べて、どちらがクリーンアップしていないかを見つけることができます。

  2. 接続を作成できなかったときに完全な例外スタックトレースを実行し、新しいConnectionを作成する場所までコードをたどります。接続を作成するすべてのコード行がconnection.close();

max_connectionsを高く設定する方法:

postgresql.confのmax_connectionsは、データベースサーバーへの同時接続の最大数を設定します。

  1. 最初にpostgresql.confファイルを見つけます
  2. どこにあるかわからない場合は、sqlでデータベースを照会します:SHOW config_file;
  3. 私の居場所:/var/lib/pgsql/data/postgresql.conf
  4. ルートとしてログインし、そのファイルを編集します。
  5. 文字列「max_connections」を検索します。
  6. max_connections=100という行が表示されます。
  7. その数値を大きく設定し、postgresqlバージョンの制限を確認してください。
  8. 変更を有効にするために、postgresqlデータベースを再起動します。

max_connectionsの最大値は?

次のクエリを使用します。

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

理論的には8388607という値を取得しますが、理論上はそれが許可されている最大数ですが、暴走したプロセスは何千もの接続を使い果たしてしまい、驚くことに、データベースは再起動するまで応答しません。 100のような賢明なmax_connectionsがある場合、問題のプログラムは新しい接続を拒否されます。

133
Eric Leschinski

MaxConnectionsとInitialConnectionsを増やす必要はありません。作業を終えたら、接続を閉じてください。たとえば、接続を作成している場合:

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

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

作業終了後、接続を閉じます。

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

たとえば、すべての接続を閉じる必要があります。INSERTINTOステートメントを作成する場合、この方法でステートメントと接続を閉じる必要があります。

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

SELECTステートメントを作成する場合は、次の方法でステートメント、接続、および結果セットを閉じる必要があります。

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

私はこれをやった、それは働いた

0
Brayan Escobedo

問題のある行は次のとおりです。

MaxConnections=90
InitialConnections=80

値を増やして、より多くの接続を許可できます。

0
Delan Azabani