SupabaseのDBコネクションが枯渇する問題の解決方法

要約
Supabase のデフォルト Pool Size(15)は DB 最大接続数の25%で、並列処理やアクセス集中時にすぐ枯渇します。Data APIを使う場合は安全性を考慮して40%、使わない場合は最大80%まで引き上げ可能です。
意見はこのエリアに表示されます

はじめに

Supabase をバックエンドサーバーから利用する場合、Supabase SDKを使わずにSession Pooler(Supavisor) を使った接続が望ましいです。

Session Pooler 自体の概要や、なぜ Supabase ではこれを使うべきかについては、別の記事で詳しくまとめています。

ただし、そのときに デフォルト設定のままでは、想像以上に早くコネクションが枯渇してしまいます

本記事では、

  • なぜデフォルト設定のままだとコネクションが枯渇するのか
  • どの設定値を、どのように変更すればよいのか
  • その設定を「有効化・増やしても問題ない」と言える理由

を、Session Pooler の仕組みを踏まえながら解説していきます。

結論としてやることはシンプルで、デフォルトの設定値を適切に引き上げるだけです。
しかし「なぜそれで安全なのか」「どこまで増やしてよいのか」を理解せずに設定を変えるのは危険です。

この記事では、単なる設定手順だけでなく、
安心して本番に投入できる理由まで含めて説明することを目的としています。

デフォルト設定の解説(なぜすぐに枯渇するのか)

まず前提として、Supabase の Session Pooler(Supavisor)には デフォルトのプール設定 が存在します。

デフォルト値

supabaseのpool sizeの設定
Supabase Dashboard -> Database -> Settingsデフォルト設定

Database max connections:60(無料プラン)

max connections
Supabase Dashboard -> Database -> Settings 大きすぎる値を設定したときのエラー文

Pool Sizeの下のMax Client ConnectionsはClientとSession Poolerの間のコネクション数です。
Pool SizeはSession PoolerとDatabase間のコネクションの数です。その最大値は大きすぎる値を設定したときのエラー文から確認できます。

つまり、デフォルトでは DB が許容する最大接続数のうち 25% しか使っていません。

これでは、

  • Promise.all を多用した並列処理
  • アクセスが一時的に集中したとき
  • 並列でテスト(e2e / integration)を実行したとき

など短時間に DB アクセスが集中したときにすぐに枯渇してしまいます。

解決策:Pool Size を引き上げる

Supabase の公式ドキュメントでも推奨されている方法として、Pool Size を引き上げることで解決できます。

Supabase DashboardでDatabase -> Settingsから先ほどの画像のページにアクセスして変更できます。

引き上げの目安

  • Data API (Supabase SDK) を使用する場合

    • 推奨 Pool Size:40%(24 本)
    • SDK と同時に DB に接続することを考慮して安全に抑えます。
  • Data API を使用しない場合

    • 推奨 Pool Size:80%(48 本)
    • DB の最大接続数に対して余裕を持たせつつ、ほぼフルに活用可能です。

Data APIとはSupabaseがデフォルトで提供しているデータ取得のためのAPIです。Supabase SDKも内部的にこれを使用しています。

なぜ Pool Size を引き上げてもよいのか?

そしてなぜデフォルトは低く設定されているのか

Supabase の設計思想を理解すると、Pool Size の設定の意図が見えてきます。


Supabase の設計思想

Supabase は フロントエンドから直接データを取得することを前提 に設計されています。

  • クライアントからのデータ取得は基本的に Data API (Supabase SDK) を経由
  • 直接 DB に接続すると、RLS(Row Level Security)が効かず安全性が担保されない
  • そのため、Data API 経由でアクセスする設計がメイン

つまり、通常のアプリ利用では DB への直接接続は少なくても十分 という前提があります。


max connections の内訳

DB の max_connections(無料プランでは 60 本)は、単にユーザーアプリの接続だけでなく、以下の用途も含まれます:

  • Data API や Auth など Supabase が内部で DB にアクセスする場合
  • RLS や認証処理など、内部処理用のコネクション

そのため、デフォルト設定の Pool Size = 15 は「内部処理を含めて安全に収まる値」として保守的に設定されています。


つまりどういうことか

  • Data API をメインに使う場合 → Pool Size を低めにしても問題ない
  • Data API を使わず、バックエンドから直接 DB にアクセスする場合 → Pool Size をもっと大きくしても安全

デフォルトの 15 本は、Data API を前提とした設計上の保守的な値 であり、実運用や並列処理が多い環境では明らかに余裕が足りません。


結論

  • デフォルト設定は安全側に寄せた値
  • Data API を使わない場合やアクセス集中が予想される場合は、Pool Size を引き上げるのが正しい選択
  • 内部アクセスと合わせても、DB の最大接続数を超えなければ安定して運用可能
Explore More
関連記事はありません。