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
server.propertiesファイルが何であるかわかりません。SimocoPoolSizeが何を意味するかもわかりません
データベース接続のカスタムプールを使用していると仮定しましょう。次に、問題は、プールが100または120接続を開くように構成されているが、PostgresqlサーバーがMaxConnections=90
を受け入れるように構成されていることだと思います。これらは矛盾する設定のようです。 MaxConnections=120
を増やしてみてください。
ただし、プールで非常に多くのオープン接続が本当に必要な場合は、まずデータベース層インフラストラクチャを理解し、使用しているプールを把握する必要があります。そして、特に、開いている接続をプールに正常に戻す場合
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は、データベースサーバーへの同時接続の最大数を設定します。
SHOW config_file;
/var/lib/pgsql/data/postgresql.conf
max_connections=100
という行が表示されます。max_connectionsの最大値は?
次のクエリを使用します。
select min_val, max_val from pg_settings where name='max_connections';
理論的には8388607
という値を取得しますが、理論上はそれが許可されている最大数ですが、暴走したプロセスは何千もの接続を使い果たしてしまい、驚くことに、データベースは再起動するまで応答しません。 100のような賢明なmax_connectionsがある場合、問題のプログラムは新しい接続を拒否されます。
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();
}
たとえば、すべての接続を閉じる必要があります。INSERTINTOステートメントを作成する場合、この方法でステートメントと接続を閉じる必要があります。
statement.close();
Connexion.close():
SELECTステートメントを作成する場合は、次の方法でステートメント、接続、および結果セットを閉じる必要があります。
resultset.close();
statement.close();
Connexion.close();
私はこれをやった、それは働いた
問題のある行は次のとおりです。
MaxConnections=90
InitialConnections=80
値を増やして、より多くの接続を許可できます。