跳到主要內容

Neon

本指南說明如何

什麼是 Neon?

Neon's logo

Neon 是一個完全託管的 Serverless PostgreSQL,提供慷慨的免費方案。Neon 分離了儲存和運算,並提供現代開發人員功能,例如 Serverless、分支、無限儲存等等。Neon 是開源的,並以 Rust 編寫。

在此處了解更多關於 Neon 的資訊 here

與其他資料庫供應商的共通之處

將 Prisma ORM 與 Neon 一起使用的許多方面,就像將 Prisma ORM 與任何其他 PostgreSQL 資料庫一起使用一樣。您可以

需要考量的差異

在決定將 Neon 與 Prisma ORM 一起使用時,您應該注意 Neon 和 PostgreSQL 之間的一些差異

  • Neon 的 Serverless 模型 — 預設情況下,Neon 會在閒置 5 分鐘後將 運算資源 縮減為零。在此狀態期間,運算實例處於閒置狀態。此功能的一個特點是「冷啟動」的概念。從閒置狀態啟動運算資源需要 500 毫秒到幾秒鐘的時間。根據連線到資料庫所需的時間長度,您的應用程式可能會逾時。若要了解更多資訊,請參閱:連線延遲和逾時
  • Neon 的連線池 — Neon 使用 PgBouncer 提供連線池,最多可支援 10,000 個並行連線。若要了解更多資訊,請參閱:連線池

如何使用 Neon 的連線池

如果您想使用 Neon 中提供的 連線池,您需要在 Prisma schema 的 datasource 區塊的 url 屬性中使用的 DATABASE_URL 環境變數的主機名稱中加入 -pooler

.env
# Connect to Neon with Pooling.
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417-pooler.us-east-2.aws.neon.tech:5432/neondb?sslmode=require

如果您想使用 Prisma CLI 以便對資料庫執行其他動作(例如遷移),您需要新增一個 DIRECT_URL 環境變數,以便在 Prisma schema 的 datasource 區塊的 directUrl 屬性中使用,這樣 CLI 將使用直接連線字串(不包含 PgBouncer)

.env
# Connect to Neon with Pooling.
DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417-pooler.us-east-2.aws.neon.tech/neondb?sslmode=require

# Direct connection to the database used by Prisma CLI for e.g. migrations.
DIRECT_URL="postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb"

然後您可以更新您的 schema.prisma 以使用新的直接 URL

schema.prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
directUrl = env("DIRECT_URL")
}

關於 directUrl 欄位的更多資訊,請參閱 此處

資訊

我們強烈建議在您的 DATABASE_URL 環境變數中使用池化連線字串。您將獲得 Prisma CLI 的絕佳開發人員體驗,同時也允許連線被池化,而無需考慮部署策略。雖然這並非每個應用程式都絕對必要,但 Serverless 解決方案將不可避免地需要連線池。

解決連線逾時問題

從 Prisma ORM 連線到 Neon 時發生的連線逾時會導致類似以下的錯誤

Error: P1001: Can't reach database server at `ep-white-thunder-826300.us-east-2.aws.neon.tech`:`5432`
Please make sure your database server is running at `ep-white-thunder-826300.us-east-2.aws.neon.tech`:`5432`.

此錯誤很可能表示 Prisma Client 建立的連線在 Neon 運算資源啟動之前已逾時。

Neon 運算資源有兩個主要狀態:ActiveIdle。Active 表示運算資源目前正在執行中。如果 5 分鐘內沒有查詢活動,Neon 預設會將運算資源置於閒置狀態。請參閱 Neon 的文件以 了解更多資訊

當您從 Prisma ORM 連線到閒置的運算資源時,Neon 會自動啟動它。啟動通常在幾秒鐘內完成,但增加的延遲可能會導致連線逾時。為了解決此問題,您可以透過新增 connect_timeout 參數來調整您的 Neon 連線字串。此參數定義了等待開啟新連線的最長秒數。預設值為 5 秒。較高的設定應提供避免連線逾時問題所需的時間。例如

DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=10
資訊

connect_timeout 設定為 0 表示沒有逾時。

連線逾時的另一個可能原因是 Prisma ORM 的 連線池,其預設逾時時間為 10 秒。這通常對 Neon 來說已足夠時間,但如果您仍然遇到連線逾時問題,您可以嘗試增加此限制(除了上述的 connect_timeout 設定),方法是將 pool_timeout 參數設定為更高的值。例如

DATABASE_URL=postgres://daniel:<password>@ep-mute-rain-952417.us-east-2.aws.neon.tech/neondb?connect_timeout=15&pool_timeout=15

如何將 Neon 的 Serverless 驅動程式與 Prisma ORM 搭配使用 (預覽版)

Neon Serverless 驅動程式 是一個適用於 JavaScript 和 TypeScript 的低延遲 Postgres 驅動程式,可讓您透過 HTTP 或 WebSocket 而非 TCP 從 Serverless 和邊緣環境查詢資料。

您可以將 Prisma ORM 與 Neon Serverless 驅動程式搭配使用,方法是使用 驅動程式轉接器。驅動程式轉接器可讓您使用與 Prisma ORM 提供的預設驅動程式不同的資料庫驅動程式,來與您的資料庫進行通訊。

資訊

此功能在 Prisma ORM 5.4.2 及更高版本中以預覽版形式提供。

若要開始使用,請啟用 driverAdapters 預覽功能標誌

generator client {
provider = "prisma-client-js"
previewFeatures = ["driverAdapters"]
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

產生 Prisma Client

npx prisma generate

安裝適用於 Neon 的 Prisma ORM 轉接器、Neon Serverless 驅動程式和 ws 套件

npm install @prisma/adapter-neon @neondatabase/serverless ws
npm install --save-dev @types/ws

更新您的 Prisma Client 實例

import { Pool, neonConfig } from '@neondatabase/serverless'
import { PrismaNeon } from '@prisma/adapter-neon'
import { PrismaClient } from '@prisma/client'
import dotenv from 'dotenv'
import ws from 'ws'

dotenv.config()
neonConfig.webSocketConstructor = ws
const connectionString = `${process.env.DATABASE_URL}`

const pool = new Pool({ connectionString })
const adapter = new PrismaNeon(pool)
const prisma = new PrismaClient({ adapter })

然後,您可以像平常一樣使用 Prisma Client,並具有完整的類型安全。Prisma Migrate、內省 (introspection) 和 Prisma Studio 將繼續像以前一樣運作,使用在 Prisma schema 中定義的連線字串。

注意事項

指定 PostgreSQL schema

您可以透過在實例化 PrismaNeon 時傳遞 schema 選項來指定 PostgreSQL schema

const adapter = new PrismaNeon(pool, {
schema: 'myPostgresSchema'
})