接続プーリングを使用する
Lakebaseは、サーバー接続のプールを維持し、それらを多くのクライアント接続間で共有するPgBouncer接続プーラーが組み込まれています。 プーラーは最大 10,000 の クライアント接続をサポートしており、 レス関数、Web APIs 、および多数の短時間接続を開くその他のアプリケーションに適しています。
コネクションプーリングには、Postgresネイティブのパスワード認証が必要です。OAuthロールでは利用できません。
接続プーリングの仕組み
PostgreSQLはクライアントごとに個別のプロセスを作成するため、PostgreSQLへの接続ごとにサーバーリソースが消費されます。接続が増えると、サーバーの接続制限をすぐに使い果たしてしまう可能性があります。
コネクションプーラーは、アプリケーションとPostgreSQLの間に位置します。クライアントはプーラーに接続し、プーラーはクエリをより小規模な実際のサーバー接続プールに転送します。LakebaseはPgBouncerをトランザクションモードで実行するため、サーバー接続は単一のトランザクションの期間中のみ保持され、その後プールに戻されます。これにより、多くのクライアントが少数のサーバー接続を共有できます。
接続プール
PgBouncerは、データベースとユーザーの組み合わせごとに個別のプールを作成します。同じデータベースに接続する2人のユーザーは、それぞれ独立したプールを割り当てられます。各プールのサイズは Postgres max_connections制限の約 90% であり、コンピュート サイズによって異なります。
プール内のすべての接続が使用中の場合、新しいクライアントからのリクエストはキューで待機します。サーバーへの接続が2分以内に確立されない場合、クライアントはタイムアウトエラーを受け取ります。

この図は、異なるユーザーからの複数のクライアント接続が、個別の PgBouncer (ユーザー/データベースの組み合わせごとに 1 つ) を経由してルーティングされ、限られた数の実際の Postgres 接続を共有する様子を示しています。
接続制限
接続プーリングには3つの制限があります。
上限 | Value | それが制御するもの |
|---|---|---|
クライアント接続数( | 10,000 | アプリケーションからPgBouncerへの最大接続数 |
プールサイズ( | 約90% | ユーザーとデータベースのペアごとのアクティブなサーバー接続数 |
直接接続( | コンピュートサイズにより異なります | 最大直接Postgres接続数 |
直接接続の制限はコンピュートのサイズによって異なります。 たとえば、8 CU コンピュートは 1,678 の直接接続をサポートし、16 CU コンピュートは 3,357 の直接接続をサポートします。 完全なリストについては、 「コンピュート仕様」を参照してください。
クライアント接続数の上限が10,000件というのは、同時に10,000件のクエリ結果が得られるという意味ではありません。これは、PgBouncerが受け入れるクライアント接続の最大数を表します。アクティブなトランザクションの数は、 サイズによって制限されます。これは、 max_connectionsの約 90% です。
接続プーリングを有効にする
前提条件
- Lakebaseオートスケール プロジェクトがアクティブである必要があります。
- プロジェクトには、ネイティブのPostgresパスワードロールが必要です。手順については、 「ネイティブPostgresパスワードロールを作成する」を参照してください。
- 読み取り専用コンピュート インスタンスで接続プーリングを使用するには、 [読み取り専用コンピュート インスタンスへのアクセスを許可 する] が有効になっている高可用性エンドポイントが必要です。 高可用性を参照してください。
ステップ
- Lakebaseアプリで、プロジェクトに移動して 「接続」 をクリックします。
- 接続したいブランチとコンピュートを選択します。
- 「役割」 ドロップダウンメニューから、ネイティブのPostgresパスワードロールを選択します。 接続プーリングの スイッチは、パスワードロールが選択されている場合にのみ表示されます。OAuthロールでは非表示になっています。
- 接続プーリング を有効にします。
- 接続文字列をコピーして、アプリケーションで使用してください。

接続文字列の形式
プーラー接続文字列は、データベースへの直接接続とは異なるホスト名を使用します。ホスト名には、読み取り/書き込みコンピュートの場合はエンドポイント ID の後に-poolerが含まれ、読み取り専用コンピュートの場合は-ro-pooler含まれます。
クラスタータイプ | ホスト名の形式 | いつ使用するか |
|---|---|---|
読み書き可能なコンピュート |
| すべての書き込みと読み取りトラフィック |
読み取り専用コンピュート |
| 読み取り専用トラフィック。読み取りアクセスが有効になっている高可用性エンドポイントが必要です。 |
どちらもポート5432を使用します。
Lakebaseアプリの 接続 ダイアログからプーラー接続文字列を直接コピーして、エンドポイント、リージョン、クラウドに対応する正しいホスト名を取得してください。
PgBouncerの設定
Lakebaseは、以下の設定でPgBouncerを管理します。これらの設定は固定されており、カスタマイズできません。
[pgbouncer]
pool_mode=transaction
max_client_conn=10000
default_pool_size=0.9 * max_connections
max_prepared_statements=1000
query_wait_timeout=120
設定 | 説明 |
|---|---|
| サーバー接続は、各トランザクション終了後にプールに戻されます。トランザクションモードを参照してください。 |
| 最大 PgBouncer が受け入れるクライアント接続数。 |
| (ユーザー、データベース)ペアごとのアクティブなサーバー接続数。コンピュートサイズにより異なります。 |
| トランザクションモードでプロトコルレベルのプリペアドステートメントを許可します。追跡対象となる明細書の件数を、クライアント接続ごとに1,000件に制限します。 |
| クライアントがタイムアウトエラーを受け取るまでにサーバー接続を待機する秒数。 |
取引モード
トランザクションモードは接続効率を向上させますが、永続的なサーバー接続を必要とする一部のPostgres機能を制限します。接続プーラーを使用する場合、以下の機能は利用できません。
-
SQL レベルのプリペアド ステートメント :
PREPAREおよびDEALLOCATEステートメントはトランザクション モードではサポートされていません。ドライバレベルのプリペアドステートメント(psycopg、node-postgres、JDBC、および同様のライブラリが内部的に使用するもの)は、PgBouncerのプロトコルレベルのサポートを通じて正しく動作します。JDBCの場合、プリペアドステートメントに関連するエラーが表示される場合は、prepareThreshold=0を設定して、名前付きサーバー側プリペアドステートメントのキャッシュを無効にしてください。 -
セッションレベルの設定 :
SETコマンドはトランザクション間で保持されません。これは、各トランザクションが異なるサーバー接続を使用する可能性があるためです。例えば:SQLBEGIN;
SET search_path TO myschema;
SELECT * FROM mytable; -- works in this transaction
COMMIT;
-- connection returns to pool after COMMIT
SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist設定を永続的に適用するには、代わりに
ALTER ROLEを使用してください。SQLALTER ROLE myrole SET search_path TO myschema, public; -
セッション保持一時テーブル :トランザクションをまたいで保持される一時テーブルは利用できません。プールに戻された接続は、次のトランザクションで別のクライアントに割り当てられる可能性があります。
-
WITH HOLDカーソル :WITH HOLDで宣言されたカーソルは永続的な接続を必要とし、サポートされていません。 -
アドバイザリロック :PgBouncerはアドバイザリロックをサポートしていません。アドバイザリロックには永続的なサーバー接続が必要ですが、トランザクションモードではそれが利用できません。
-
LISTEN/NOTIFY: サポートされていません。パブリッシュ/サブスクライブ型のメッセージングを必要とするアプリケーションには、直接接続(プール接続ではない)を使用してください。 -
pg_dumpおよびスキーマ移行 :pg_dump、スキーマ移行、およびセッションレベルの状態に依存するその他のツールには、直接接続を使用します。
セッションレベルのPostgres機能を必要とするアプリケーションの場合は、 接続プーリング スイッチを有効にせずに、 [接続] ダイアログから直接接続文字列を使用してください。