次のエラーの説明:
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;
デバッグ戦略
-
接続を解放していない可能性のあるプログラムに異なるユーザー名/パスワードを指定して、接続がどれであるかを確認し、pg_stat_activityを調べて、それ自体がクリーンアップされていないものを確認できます。
-
接続を作成できなかった場合は、完全な例外スタックトレースを実行し、新しい
Connection
を作成する場所までコードをたどります。 、接続を作成するすべてのコード行がconnection.close();
で終了していることを確認してください
max_connectionsを高く設定する方法:
postgresql.confのmax_connectionsは、データベースサーバーへの同時接続の最大数を設定します。
- 最初にpostgresql.confファイルを見つけます
- どこにあるかわからない場合は、次のSQLを使用してデータベースにクエリを実行します。
SHOW config_file;
- 鉱山は次の場所にあります:
/var/lib/pgsql/data/postgresql.conf
- rootとしてログインし、そのファイルを編集します。
- 文字列「max_connections」を検索します。
-
max_connections=100
という行が表示されます 。 - その数を大きく設定し、postgresqlバージョンの制限を確認してください。
- 変更を有効にするには、postgresqlデータベースを再起動します。
最大max_connectionsはいくつですか?
このクエリを使用します:
select min_val, max_val from pg_settings where name='max_connections';
値8388607
を取得します 、理論的にはこれが許可されている最大数ですが、暴走したプロセスは数千の接続を消費する可能性があり、驚いたことに、データベースは再起動するまで応答しません。 100のような賢明なmax_connectionsがある場合、問題のあるプログラムは新しい接続を拒否されます。