Prisma Accelerateの使用を開始する
前提条件
Accelerateを使い始めるには、以下が必要です
- A
- Prisma Client
4.16.1
以降を使用しているプロジェクト。インタラクティブトランザクションを使用している場合は、5.1.1
以降を使用する必要があります。(常に最新バージョンのPrismaを使用することを推奨します。) - ホストされたPostgreSQL、MySQL/MariaDB、PlanetScale、CockroachDB、またはMongoDBデータベース
1. Accelerateを有効にする
Prisma Data Platformプロジェクトに移動し、環境を選択して、データベース接続文字列を提供し、データベースに最も近いリージョンを選択してAccelerateを有効にします。
IPホワイトリストまたは信頼されたIPアドレスでのファイアウォール設定が必要な場合は、セキュリティ強化のために静的IPを有効にしてください。Platform ConsoleでAccelerateの静的IPを有効にする方法について詳しくはこちらをご覧ください。
2. アプリケーションにAccelerateを追加する
2.1. データベース接続文字列を更新する
有効にすると、新しいAccelerate接続文字列で使用するAPIキーの生成を求められ、これを使用してリクエストを認証します。
直接データベースURLを新しいAccelerate接続文字列に置き換えます。
# New Accelerate connection string with generated API_KEY
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
# Previous (direct) database connection string
# DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"
更新された接続文字列は、Prismaスキーマファイルのdatasource url
として使用されます。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
Prisma MigrateおよびIntrospectionはprisma://
接続文字列では動作しません。これらの機能を引き続き使用するには、.env
ファイルにDIRECT_DATABASE_URL
という新しい変数を追加し、その値に直接データベース接続文字列を設定してください。
DATABASE_URL="prisma://accelerate.prisma-data.net/?api_key=__API_KEY__"
DIRECT_DATABASE_URL="postgresql://user:password@host:port/db_name?schema=public"
次に、Prismaスキーマのdatasource
ブロックに、以下のdirectUrl
というフィールドを追加します。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_DATABASE_URL")
}
この設定が提供されている場合、マイグレーションとイントロスペクションはurl
で定義された接続文字列ではなく、directUrl
接続文字列を使用します。
directUrl
は、マイグレーションやイントロスペクションを実行するのに便利です。しかし、アプリケーションでAccelerateを使用するためにdirectUrl
は必要ありません。
PrismaをPostgreSQLで使用している場合、Prisma MigrateとIntrospectionがprisma+postgres://
接続文字列で動作するため、directUrl
は必要ありません。
2.2. Accelerate Prisma Client拡張機能をインストールする
💡 Accelerateには、Prisma Clientバージョン4.16.1
以降と、@prisma/extension-accelerate
バージョン1.0.0
以降が必要です。
💡 Accelerate拡張機能@prisma/extension-accelerate
バージョン2.0.0
以降には、Node.jsバージョン18
以降が必要です。
Prisma ClientとAccelerate Prisma Client拡張機能の最新バージョンをインストールします
npm install @prisma/client@latest @prisma/extension-accelerate
2.3. Accelerate用Prisma Clientを生成する
Prismaバージョン5.2.0
以降を使用している場合、Prisma Clientはデータベース接続文字列のプロトコルに基づいて、どのようにデータベースに接続するかを自動的に判断します。DATABASE_URL
の接続文字列がprisma://
で始まる場合、Prisma ClientはPrisma Accelerateを使用してデータベースに接続しようとします。
AWS EC2にデプロイされたサーバーのような、長時間稼働するアプリケーションサーバーでPrisma Accelerateを使用する場合、以下のコマンドを実行してPrisma Clientを生成できます。
npx prisma generate
ServerlessまたはEdgeアプリケーションでPrisma Accelerateを使用する場合、Prisma Clientを生成するために以下のコマンドを実行することを推奨します。
npx prisma generate --no-engine
--no-engine
フラグは、生成されたPrisma ClientにQuery Engineファイルが含まれるのを防ぎ、アプリケーションのバンドルサイズを小さく保ちます。
Prismaのバージョンが5.2.0
未満の場合、--accelerate
オプションでPrisma Clientを生成してください。
npx prisma generate --accelerate
Prismaのバージョンが5.0.0
未満の場合、--data-proxy
オプションでPrisma Clientを生成してください。
npx prisma generate --data-proxy
2.4. Accelerate拡張機能でPrisma Clientインスタンスを拡張する
既存のPrisma ClientインスタンスをAccelerate拡張機能で拡張するには、以下を追加します。
import { PrismaClient } from '@prisma/client'
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
エッジランタイム(Cloudflare Workers、Vercel Edge Functions、Deno Deploy、Supabase Edge Functionsなど)にデプロイする場合、代わりにエッジクライアントを使用してください。
import { PrismaClient } from '@prisma/client/edge'
import { withAccelerate } from '@prisma/extension-accelerate'
const prisma = new PrismaClient().$extends(withAccelerate())
VS Codeが$extends
メソッドを認識しない場合は、問題を解決するためのこのセクションを参照してください。
他の拡張機能またはミドルウェアでAccelerate拡張機能を使用する
拡張機能は1つずつ適用されるため、正しい順序で適用してください。拡張機能は動作を共有できず、最後に適用された拡張機能が優先されます。
アプリケーションでPrisma Optimizeを使用している場合、Accelerate拡張機能より前に適用されていることを確認してください。例:
const prisma = new PrismaClient().$extends(withOptimize()).$extends(withAccelerate())
アプリケーションでPrisma Middlewareを使用している場合、Prisma Client拡張機能(Accelerateなど)よりも前に追加されていることを確認してください。例:
const prisma = new PrismaClient().$use(middleware).$extends(withAccelerate())
2.5. データベースクエリでAccelerateを使用する
withAccelerate
拡張機能は主に2つのことを行います。
- 各適用可能なモデルメソッド内で
cacheStrategy
フィールドにアクセスできるようにし、クエリごとにキャッシュ戦略を定義できるようにします。 - すべてのクエリを接続プーラー経由でルーティングします。
コネクションプールのみを使用するキャッシュ戦略なし
キャッシュ戦略を適用せずにAccelerateのコネクションプーリング機能を利用したいだけであれば、Accelerateなしの場合と同じ方法でクエリを実行できます。
Accelerateを有効にしてAccelerate接続文字列を提供すると、クエリはデフォルトでコネクションプーラーを使用するようになります。
キャッシュ戦略を定義する
新しいcacheStrategy
プロパティでクエリを更新します。これにより、その特定のクエリのキャッシュ戦略を定義できます。
const user = await prisma.user.findMany({
where: {
email: {
contains: 'alice@prisma.io',
},
},
cacheStrategy: { swr: 60, ttl: 60 },
})
上記の例では、swr: 60
とttl: 60
は、Accelerateが60秒間キャッシュデータを提供し、その後、Accelerateがバックグラウンドで新しいデータをフェッチしながらさらに60秒間キャッシュデータを提供することを意味します。
これで、キャッシュされたクエリのパフォーマンスが向上するはずです。
どの戦略がアプリケーションに最適かについては、キャッシュ戦略の選択を参照してください。
Prismaバージョン5.2.0
以降では、Accelerate接続文字列でPrisma Studioを使用できます。
キャッシュを無効にし、キャッシュされたクエリ結果を最新の状態に保つ
アプリケーションがリアルタイムまたはほぼリアルタイムのデータを必要とする場合、キャッシュの無効化により、大きなttl
(Time-To-Live)またはswr
(Stale-While-Revalidate)のキャッシュ戦略を使用している場合でも、ユーザーが最新のデータを確認できるようになります。キャッシュを無効にすることで、必要なときにいつでもライブデータを表示するために、長いキャッシュ期間をバイパスできます。
たとえば、ダッシュボードに顧客情報が表示され、顧客の連絡先詳細が変更された場合、キャッシュの無効化により、そのデータのみを即座に更新できるため、サポート担当者はキャッシュの有効期限が切れるのを待つことなく常に最新の情報を確認できます。
キャッシュされたクエリ結果を無効にするには、タグを追加してから$accelerate.invalidate
APIを使用できます。
オンデマンドキャッシュ無効化は有料プランで利用可能です。詳細については、料金をご覧ください。
以下のクエリを無効にするには
await prisma.user.findMany({
where: {
email: {
contains: "alice@prisma.io",
},
},
cacheStrategy: {
swr: 60,
ttl: 60,
tags: ["emails_with_alice"],
},
});
$accelerate.invalidate
APIにキャッシュタグを提供する必要があります。
try {
await prisma.$accelerate.invalidate({
tags: ["emails_with_alice"],
});
} catch (e) {
if (e instanceof Prisma.PrismaClientKnownRequestError) {
// The .code property can be accessed in a type-safe manner
if (e.code === "P6003") {
console.log(
"You've reached the cache invalidation rate limit. Please try again shortly."
);
}
}
throw e;
}