テック技報最新号へ →
コード

Postgres: statement_timeout はアプリ用ロールに ALTER ROLE で設定する

暴走したクエリ 1 本が接続とロックを握り続けるのを防ぐため、ALTER ROLE app SET statement_timeout = '5s' のようにアプリが接続するロールに上限を付ける。マイグレーションやバッチは別ロール(または SET で上書き)にして長く走れるようにする。

@amitsinha__07 · 投稿 2026-10-23
#postgres#infra#timeout

なぜロール単位か

  • postgresql.conf で全体に付けると、マイグレーションや pg_dump、分析クエリまで切れてしまう。
  • アプリ側のコードで毎回 SET するのは漏れやすい(接続プールで別の接続に当たる、など)。

ロールに付けておけば、そのロールでログインした全セッションに自動で効く。

設定例

sql
-- Web アプリ用: 短く
ALTER ROLE app SET statement_timeout = '5s';
-- トランザクションを開けたまま放置された接続を切る
ALTER ROLE app SET idle_in_transaction_session_timeout = '30s';
-- ロック待ちで詰まらないように(任意)
ALTER ROLE app SET lock_timeout = '2s';

-- バッチ用ロールは長め、またはセッション内で上書き
ALTER ROLE batch SET statement_timeout = '10min';
sql
-- 確認(新しい接続から)
SHOW statement_timeout;
-- ロールに付いている設定の一覧
SELECT rolname, rolconfig FROM pg_roles WHERE rolconfig IS NOT NULL;

注意点

出典

X の元の投稿を開く