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