sql >> データベース >  >> RDS >> PostgreSQL

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

    次のエラーの説明:

    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がある場合、問題のあるプログラムは新しい接続を拒否されます。



    1. PentahoDataIntegrationおよびBAServerツールへのMicrosoftSQLServerJDBCドライバーのインストール

    2. MySQLユーザー権限

    3. 2016年に登場するOracle12.2.0.1

    4. PostgresENUMデータ型またはCHECKCONSTRAINT?