コネクションプーリング
Prisma Postgresは、デフォルトで組み込みのコネクションプーリングを提供しており、これはPrisma Accelerateによって有効化されます。Prisma Postgresを使用することで、何も設定することなくコネクションプーリングの恩恵を受けることができます。データベース接続の効率的な管理により、利用可能なデータベース接続を使い果たすことなく、より多くのクエリを処理できるようになり、アプリケーションの拡張性が向上します。
しかし、場合によっては、アプリケーションのパフォーマンスを最適化するために、コネクションプーリングをさらに設定することが有益となる場合があります。
このドキュメントは、Prisma Postgresのコネクションプーリング機能に焦点を当てています。Prisma ORMの内部コネクションプールに関する詳細については、ORMコネクションプーリングのドキュメントを参照してください。
Prisma Postgresにおけるコネクションプーリング
現在、Prisma PostgresはPrismaスキーマごとに最大10の同時データベース接続を許可しています。この制限は、Prisma Postgresの効率的なユニカーネルベースのアーキテクチャにより、通常は十分であり、大規模なコネクションプールは不要です。
Prisma Accelerateで独自のデータベースを使用している場合、接続制限は異なります。
- Starterプラン: 最大
10
接続。これはほとんどのワークロードで十分ですが、高トラフィックまたは集中的な計算操作を予想している場合は、この制限を増やすことをお勧めします。 - Proプラン: 最大
100
の同時接続をサポートします。 - Businessプラン: 最大
1000
の同時接続をサポートします。
プランの比較はPrisma料金ページで行うことができます。
コネクションプールサイズの構成
Prisma Postgresを使用していない場合、Prisma ORMのコネクションプールサイズは、接続文字列で指定して構成できます。
Prisma Postgresの場合、接続制限は現在10
に固定されており、変更することはできません。
独自のデータベースでPrisma Accelerateを使用している場合、Accelerateのセットアップページでプロジェクトの「Connection limit
」設定を通じてコネクションプールサイズを構成できます。
コネクションプールタイムアウトの構成
コネクションプールタイムアウトとは、Prisma Postgresの内部コネクションプールからの接続を待機している間に、クエリがブロックされる最大秒数です。これは、同時リクエスト数が接続制限を超えた場合に発生し、空き接続が利用可能になるまで追加のリクエストがキューに格納されます。プールタイムアウト内に空き接続が利用可能にならない場合、例外がスローされます。コネクションプールタイムアウトは、値を0に設定することで無効にできます。
コネクションプールサイズと同様に、データベース接続文字列を介してコネクションプールタイムアウトも構成できます。この値を調整するには、pool_timeout
パラメータをデータベース接続文字列に追加します。
例:
postgresql://user:password@localhost:5432/db?connection_limit=10&pool_timeout=20
pool_timeout
のデフォルト値は10
秒です。
クエリ制限の構成
Prisma Accelerateを使用する場合、Prisma Postgresプロジェクト環境のSettingsタブから、最小および最大クエリ応答サイズ、クエリ期間、およびトランザクション制限を設定できます。
クエリタイムアウト制限
Prisma Postgresには、各クエリのデフォルトのグローバルタイムアウトが10秒
に設定されており、これはサブスクリプションプランに応じてQuery durationというラベルの付いたスライダーで構成できます。
プラン | Starter | Pro | Business |
---|---|---|---|
クエリタイムアウト | 最大10 秒 | 最大20 秒 | 最大60 秒 |
詳細については、エラーリファレンスと料金ページを参照してください。
クエリタイムアウトを増やすことはできますが、10
秒以上かかるデータベースクエリについては、調査して最適化することをお勧めします。これは、基盤となるデータベースへの負担を軽減するのに役立ちます。なぜなら、長時間実行されるクエリは最適化の必要性を示すことが多いためです。エラーリファレンスで詳細を確認してください。
対話型トランザクションクエリタイムアウト制限
Prisma Postgresには、各対話型トランザクションのデフォルトのグローバルタイムアウトが15秒
に設定されており、これはサブスクリプションプランに応じてTransaction durationというラベルの付いたスライダーで構成できます。
プラン | Starter | Pro | Business |
---|---|---|---|
対話型トランザクション制限 | 最大15 秒 | 最大30 秒 | 最大90 秒 |
詳細については、エラーリファレンスと料金ページを参照してください。
Prisma Consoleで対話型トランザクションのタイムアウトを長く設定する場合、タイムアウトのトランザクションオプションを通じて、対話型トランザクションクエリで一致するtimeout
値も指定する必要があります。そうしないと、トランザクションは低いデフォルト値(例:タイムアウト値が指定されていない場合は5秒制限)でタイムアウトしてしまいます。コードで30
秒のタイムアウトを設定する方法の例を以下に示します。
await prisma.$transaction(
async (tx) => {
// Your queries go here
},
{
timeout: 30000, // 30s
}
);
対話型トランザクションのタイムアウト制限を増やすことはできますが、15秒以上かかるデータベーストランザクションについては、調査して最適化することをお勧めします。長時間実行されるトランザクションはパフォーマンスに悪影響を与える可能性があり、最適化の必要性を示すことがよくあります。エラーリファレンスで詳細を確認し、ドキュメントの「対話型トランザクション」セクションの警告を確認してください。
応答サイズ制限
Prisma Postgresには、デフォルトのグローバル応答サイズ制限が5MB
に設定されており、これはサブスクリプションプランに応じてResponse sizeというラベルの付いたスライダーで構成できます。
プラン | Starter | Pro | Business |
---|---|---|---|
クエリサイズ | 最大5MB | 最大10MB | 最大20MB |
詳細については、エラーリファレンスと料金ページを参照してください。
クエリ応答サイズを増やすことはできますが、実際に必要なデータのみにデータ取得を制限することをお勧めします。これにより、データベースのパフォーマンスが向上し、データベースへの負担が軽減され、フロントエンドアプリケーションの応答性が高まります。サイズが5MB
を超えるクエリは、多くの場合、最適化の必要性を示しています。エラーリファレンスで詳細を確認してください。
オートスケーリング (Accelerate + 独自のデータベースのみ)
オートスケーリングは現在、Prisma Accelerateを独自のデータベースと共に使用する場合にのみ利用可能です。これは、アプリケーションのトラフィックに基づいて動的なリソース割り当てを可能にします。使用量が定義された接続制限に近づくと、Prismaは負荷を処理するために追加のリソースのプロビジョニングを開始します。トラフィックが増加し続ける場合、システムはさらにスケールアウトします。トラフィックが減少すると、効率的なリソース使用を確保するためにスケールダウンします。
仕組み
オートスケーリングは、利用可能な接続の合計を複数のクエリエンジンインスタンスに分散することで環境を水平にスケーリングするコネクションプーラーによって実現されます。
実際の動作は以下のとおりです。
- 環境の接続制限が
1000
に設定されていると仮定します。 - Prisma Accelerateは、複数のクエリエンジンインスタンス(例:100インスタンス)にスケールアップします。
- 各インスタンスには合計の一定量が割り当てられます。この例では、インスタンスあたり10接続です。
- 環境全体で1000の同時接続をサポートしているにもかかわらず、各クエリエンジンインスタンスが10の制限を報告するのはこのためです。
この分散モデルにより、アプリケーションはより多くのクエリエンジンインスタンスを起動することでトラフィックの増加に対応し、同時に接続使用量を効率的に管理できます。
オートスケーリングの有効化
オートスケーリングは、Accelerateの接続制限がデフォルト(10)より高く設定されている場合に自動的に有効になります。この機能はStarterプランでは利用できません。
環境の最大接続制限は、Prisma Data Platformプランに基づいています。
プラン | 最大接続制限 |
---|---|
Starter | 10 |
Pro | 100 |
Business | 1000 |
Enterprise | お問い合わせ |