PostgreSQLでアイドル状態の接続を自動的にクローズする方法は?
2023-10-10 09:05:51
質問
一部のクライアントは、私たちの postgresql データベースに接続しますが、接続を開いたままにしています。 一定時間操作がないと接続を閉じるよう、Postgresqlに指示することは可能でしょうか?
TL;DR
<ブロッククオート
Postgresqlのバージョン >= を使っている場合。
9.2
次に
私が思いついた解決策
コードを書きたくない場合
ということであれば
arqnidの解決策
コードを書きたくない場合
そして、あなたはPostgresqlのバージョンを使用している >= 。
14
次に
Laurenz Albe の解決策
どのように解決するのですか?
興味のある方のために、以下は私が思いついた解決策です。 クレイグ・リンガー のコメントに触発されたものです。
(...) cronジョブを使用して、接続が最後にアクティブになった時刻を調べ(pg_stat_activityを参照)、pg_terminate_backendを使用して古いものを削除します(...)
選択された解決策は以下のようになります。
- まず、Postgresql 9.2 にアップグレードします。
- 次に、1秒ごとに実行するスレッドをスケジュールします。
-
スレッドが実行されると、古い非アクティブな接続がないかどうかを調べます。
-
接続があるとみなされるのは
非アクティブ
もしその
状態
が
idle
,idle in transaction
,idle in transaction (aborted)
またはdisabled
. - 接続を考慮する 古い もしその 状態 が5分以上同じであった場合。
-
接続があるとみなされるのは
非アクティブ
もしその
状態
が
- 上記と同じことをするスレッドが追加で存在します。ただし、これらのスレッドは異なるユーザーでデータベースに接続します。
-
データベースに接続するすべてのアプリケーションに対して、少なくとも1つの接続を開いたままにしておきます。(
rank()
関数)
これはスレッドによって実行されるSQLクエリです。
WITH inactive_connections AS (
SELECT
pid,
rank() over (partition by client_addr order by backend_start ASC) as rank
FROM
pg_stat_activity
WHERE
-- Exclude the thread owned connection (ie no auto-kill)
pid <> pg_backend_pid( )
AND
-- Exclude known applications connections
application_name !~ '(?:psql)|(?:pgAdmin.+)'
AND
-- Include connections to the same database the thread is connected to
datname = current_database()
AND
-- Include connections using the same thread username connection
usename = current_user
AND
-- Include inactive connections only
state in ('idle', 'idle in transaction', 'idle in transaction (aborted)', 'disabled')
AND
-- Include old connections (found with the state_change field)
current_timestamp - state_change > interval '5 minutes'
)
SELECT
pg_terminate_backend(pid)
FROM
inactive_connections
WHERE
rank > 1 -- Leave one connection for each application connected to the database
関連
-
postgresql 重複データ削除 ケーススタディ
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み] PostgreSQLでデータベースのコピーを作成する
-
[解決済み] PostgreSQLデータベースにアクティブな接続がある場合、そのデータベースを削除する方法は?
-
[解決済み】Mac OS XでPostgreSQLサーバーを起動するには?
-
[解決済み】PostgreSQLのエラーです。Fatal: ロール "username" が存在しません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PostgreSQLのJSONBのマッチングと交差の問題について
-
postgresqlにおける時間処理のコツ(推奨)
-
どのように定期的にLinux上でpostgresqlのデータベースをバックアップする
-
GROUP BY句での定数使用に関するPostgreSQLの特別な制限について説明します。
-
postgreSQLのクエリ結果に自己インクリメントシーケンス演算が追加されました。
-
[解決済み] Postgres ENUMデータ型またはCHECK CONSTRAINT?
-
[解決済み] Postgresqlの場合。パスワード付きで psql を実行するスクリプト
-
[解決済み] PostgreSQLでトリガーを一時的に無効にするにはどうすればよいですか?
-
[解決済み] Postgresql。条件付き一意性制約
-
[解決済み] アイドル状態のPostgreSQL接続にタイムアウトはありますか?