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


93

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

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

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

私の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

回答:


38

server.propertiesファイルが何であるかはわかりません。また、SimocoPoolSizeの意味もわかりません(そうですか?)

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

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


168

次のエラーの説明:

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. rootとしてログインし、そのファイルを編集します。
  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がある場合。問題のあるプログラムは新しい接続を拒否されます。


4
なぜ一部の人々は「;」を忘れるのですか?SQLステートメントの後?!ドラッグアンドペーストを作成します:)
codervince 2016年

@codervince注意が必要です。コピーして貼り付けるのではなく、コマンドを書き写す必要があると言っても過言ではありません。
AVProgrammer

4

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();
}

11
常にfinallyブロックで接続を閉じてください!それ以外の場合、エラーが発生しても接続は開いたままになります。
tine2k 2018年

1

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

MaxConnections=90
InitialConnections=80

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


4
また、接続数を増やす場合は、接続数の増加に合わせてメモリパラメータも調整してください。
Kuberchaun 2010年

0

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

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

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

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

私はこれをしました、そしてそれは働きました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.