Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to Database Connection Management ...

sugar-cat
May 11, 2024
370

Introduction to Database Connection Management Patterns in TypeScript.pdf

sugar-cat

May 11, 2024
Tweet

Transcript

  1. 6 TypeScript 5.2で追加されたExplicit Resource Management(明示的リソース 管理)機能 • usingというキーワードとともに宣言された変数は、スコープの終わりに Symbol.disposeメソッドが自動的に呼び出される 1.

    usingについて https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management ①Disposableを実装 ②usingで変数をBinding
  2. 7 TypeScript 5.2で追加されたExplicit Resource Management(明示的リソース 管理)機能 • usingというキーワードとともに宣言された変数は、スコープの終わりに Symbol.disposeメソッドが自動的に呼び出される 1.

    usingについて https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management ①Disposableを実装 ②usingで変数をBinding ③スコープを抜ける際にSymbol.disposeの処理が 実行される ※Processのkillでは実行されない
  3. 8 TypeScript 5.2で追加されたExplicit Resource Management(明示的リソース 管理)機能 • usingというキーワードとともに宣言された変数は、スコープの終わりに Symbol.disposeメソッドが自動的に呼び出される 1.

    usingについて https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management ①Disposableを実装 ②usingで変数をBinding ③スコープを抜ける際にSymbol.disposeの処理が 実行される ※Processのkillでは実行されない ➔ try-finally blockの代替 ・宣言的なリソース解放 ・統一的なリソース解放のためのIFの提供
  4. 10 非同期処理に対応したSymbol.asyncDispose、Disposableインターフェースを 実装せずともCleanupが行えるDisposableStackもある 1. usingについて 各ランタイム上でのusing互換のAPIが実装されている ※DisposableStackはそのまま使えない(今のところ) Node.js: v20.4.0 https://nodejs.org/en/blog/release/v20.4.0#support-to-the-explicit-resource-manage

    ment-proposal Deno: v1.38 https://deno.com/blog/v1.38#using-with-deno-apis Bun: v1.0.23 https://bun.sh/blog/bun-v1.0.23#resource-management-is-now-supported Workers https://developers.cloudflare.com/workers/runtime-apis/rpc/lifecycle/#how-to-use-the -using-declaration-in-your-worker ※V8 エンジン側でネイティブサポートされてないので、 Wranglerのプレリリース 版を使用する https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-2.html#using-declarations-and-explicit-resource-management
  5. 11 昨今TypeScriptを使ったバックエンド開発のライブラリ選定は2パターン • オールインワン系 ◦ DBMSに依存しないAPI/Migration機構/Pooling (e.g. Prisma) • 組み合わせ

    • クエリビルダーとしての機能がメインなORM(軽量) (e.g. Drizzle, Kysely, sqlc) • DBMSごとコネクションプールを管理するDriver (e.g. node-postgres) 2.1. クエリビルダーとコネクションプール 2. DatabaseのConnection管理について
  6. 12 昨今TypeScriptを使ったバックエンド開発のライブラリ選定は2パターン • オールインワン系 ◦ DBMSに依存しないAPI/Migration機構/Pooling (e.g. Prisma) • 組み合わせ

    • クエリビルダーとしての機能がメインなORM(軽量) (e.g. Drizzle, Kysely, sqlc) • DBMSごとコネクションプールを管理するDriver (e.g. node-postgres) 2.1. クエリビルダーとコネクションプール 2. DatabaseのConnection管理について
  7. 21 finally部分の処理をDisposableStackのdefer内に移動 2.4. 実装方法(using: TransactionのfinallyをDisposableStackに置き換え) 2. DatabaseのConnection管理について Txのスコープを外れる際にコネクションが解放される クエリ実行時かつcleaup内のreleaseでエラーになっ た場合、エラーは上書きされずSuppressedErrorとし

    てthrowされる SuppressedErrorの各プロパティに2種類の エラーが捕捉される:最後のthrowと直近のthrow) error: conn.release()の解放エラー suppressed: op.getError()のエラー →Txの可読性・エラートレースを改善可能 ※Pool側にDisposableの実装を行っても同等の挙動を実現できます