---
name: .claude/skills/connection-pooling/SKILL.md
description: |
    データベース接続管理の専門スキル。
    サーバーレス環境での接続管理、Tursoの接続管理とEmbedded Replicas、
    高負荷時の接続最適化を専門とします。
    専門分野:
    - 接続管理設計: 環境に応じた最適な接続設定
    - サーバーレス対応: TursoでのlibSQL接続管理とEmbedded Replicas
    - Drizzle ORM統合: DrizzleでのlibSQL接続設定
    - 障害対策: 接続エラーハンドリングとリトライ
    - 監視: 接続状態の監視とアラート
    使用タイミング:
    - 新規プロジェクトでDB接続を設定する時
    - 接続設定のサイジングを決める時
    - サーバーレス環境での接続問題を解決する時
    - 接続エラーが頻発する時
    - 高負荷時の接続最適化が必要な時
    Use proactively when setting up database connections,
    troubleshooting connection issues, or optimizing for serverless.

  📚 リソース参照:
  このスキルには以下のリソースが含まれています。
  必要に応じて該当するリソースを参照してください:

  - `.claude/skills/connection-pooling/resources/error-handling.md`: 接続エラーのハンドリングとリトライ戦略
  - `.claude/skills/connection-pooling/resources/pool-sizing-guide.md`: 環境別プールサイズ設定と計算式
  - `.claude/skills/connection-pooling/resources/serverless-connections.md`: TursoでのサーバーレスlibSQL接続管理
  - `.claude/skills/connection-pooling/templates/drizzle-config-template.ts`: Drizzle ORM接続設定テンプレート
  - `.claude/skills/connection-pooling/scripts/check-connections.mjs`: 接続状態の確認と診断スクリプト

version: 1.0.0
---

# Connection Pooling

## 概要

このスキルは、データベース接続管理の設計と実装に関する
知識を提供します。特にサーバーレス環境（Turso）での
libSQL接続管理とEmbedded Replicasに焦点を当てています。

**主要な価値**:

- サーバーレス環境での安定した接続
- Embedded Replicasによるローカル↔クラウド同期
- 高負荷時のパフォーマンス維持
- 接続リソースの効率的な利用

**対象ユーザー**:

- `.claude/agents/dba-mgr.md`エージェント
- バックエンド開発者
- DevOpsエンジニア
- SREチーム

## リソース構造

```
connection-pooling/
├── SKILL.md                                    # 本ファイル
├── resources/
│   ├── pool-sizing-guide.md                   # プールサイジング
│   ├── serverless-connections.md              # サーバーレス接続
│   └── error-handling.md                      # エラーハンドリング
├── scripts/
│   └── check-connections.mjs                  # 接続状態確認
└── templates/
    └── drizzle-config-template.ts             # Drizzle設定テンプレート
```

## コマンドリファレンス

### リソース読み取り

```bash
# プールサイジング
cat .claude/skills/connection-pooling/resources/pool-sizing-guide.md

# サーバーレス接続
cat .claude/skills/connection-pooling/resources/serverless-connections.md

# エラーハンドリング
cat .claude/skills/connection-pooling/resources/error-handling.md
```

### スクリプト実行

```bash
# 接続状態確認
node .claude/skills/connection-pooling/scripts/check-connections.mjs
```

## いつ使うか

### シナリオ1: 新規プロジェクトセットアップ

**状況**: 新しいプロジェクトでDB接続を設定する

**適用条件**:

- [ ] データベースサービスが決定済み
- [ ] 想定負荷が見積もられている
- [ ] 実行環境が決まっている

**期待される成果**: 最適な接続プール設定

### シナリオ2: 接続エラーの解決

**状況**: 「too many connections」などのエラーが発生

**適用条件**:

- [ ] エラーの発生パターンが把握できている
- [ ] 現在の設定が確認できる
- [ ] 接続数の監視ができる

**期待される成果**: 安定した接続設定

### シナリオ3: サーバーレス移行

**状況**: サーバーレス環境への移行で接続管理を見直す

**適用条件**:

- [ ] サーバーレスプラットフォームが決定
- [ ] 接続パターンが理解されている
- [ ] Embedded Replicasの使用を検討している

**期待される成果**: サーバーレス対応の接続設定

## ワークフロー

### Phase 1: 要件分析

**目的**: 接続要件を明確化する

**ステップ**:

1. **環境の確認**:
   - サーバーレス vs 常駐サーバー
   - Turso Cloud / Embedded Replicas / Self-hosted
   - ワーカー数・インスタンス数

2. **負荷の見積もり**:
   - 同時リクエスト数
   - クエリの実行時間
   - ピーク時の負荷

**判断基準**:

- [ ] 実行環境が明確か？
- [ ] 負荷の見積もりがあるか？
- [ ] Embedded Replicasの使用を検討したか？

**リソース**: `resources/serverless-connections.md`

### Phase 2: 接続設計

**目的**: 適切な接続設定を決定する

**ステップ**:

1. **接続設定の実装**:

   ```typescript
   // Turso接続設定
   const config = {
     url: process.env.TURSO_DATABASE_URL,
     authToken: process.env.TURSO_AUTH_TOKEN,
   };
   ```

2. **Embedded Replicas設定**:
   ```typescript
   const client = createClient({
     url: "file:local.db", // ローカルレプリカ
     syncUrl: process.env.TURSO_DATABASE_URL,
     authToken: process.env.TURSO_AUTH_TOKEN,
     syncInterval: 60, // 60秒ごとに同期
   });
   ```

**判断基準**:

- [ ] 接続URLとトークンは設定されているか？
- [ ] Embedded Replicasの使用を検討したか？
- [ ] 同期間隔は適切か？
- [ ] リトライ設定があるか？

**リソース**: `resources/pool-sizing-guide.md`

### Phase 3: エラーハンドリング

**目的**: 接続エラーに対する回復力を確保する

**ステップ**:

1. **リトライ戦略**:
   - 指数バックオフ
   - 最大リトライ回数
   - リトライ可能なエラーの定義

2. **サーキットブレーカー**:
   - 連続失敗時のオープン
   - 回復試行間隔
   - 半開状態の管理

**判断基準**:

- [ ] リトライ戦略が実装されているか？
- [ ] タイムアウトが設定されているか？
- [ ] エラーログが記録されるか？

**リソース**: `resources/error-handling.md`

### Phase 4: 監視

**目的**: 接続状態を継続的に監視する

**ステップ**:

1. **メトリクスの収集**:
   - アクティブ接続数
   - 待機中の接続
   - 接続エラー率

2. **アラート設定**:
   - 接続枯渇の警告
   - エラー率の閾値
   - レイテンシの監視

**判断基準**:

- [ ] 接続数の監視があるか？
- [ ] アラートが設定されているか？
- [ ] ダッシュボードがあるか？

## 核心概念

### 接続プールの基本

```
アプリケーション
    │
    ├── リクエスト1 ──→ [接続1]
    ├── リクエスト2 ──→ [接続2]  ←── 接続プール
    ├── リクエスト3 ──→ [接続3]       (再利用)
    └── リクエスト4 ──→ [待機...]
                           │
                           ▼
                      データベース
```

### プールモード

| モード      | 説明                           | 用途                 |
| ----------- | ------------------------------ | -------------------- |
| Session     | 接続をセッション全体で保持     | 長いトランザクション |
| Transaction | トランザクション単位で割り当て | 一般的なWeb          |
| Statement   | ステートメント単位で割り当て   | 高速なクエリ         |

### サーバーレス特有の課題

```
Lambda/Edge Function
    │
    ├── コールドスタート → 新規接続
    │                      (オーバーヘッド)
    ├── ウォームスタート → 既存接続再利用
    │                      (高速)
    └── スケールアウト → 接続爆発のリスク
                          (プーラーで制御)
```

## ベストプラクティス

### すべきこと

1. **適切な接続方式を選択する**:
   - Turso Cloud: HTTPSベースの接続
   - Embedded Replicas: ローカルファイル + クラウド同期
   - Self-hosted: libSQL Server

2. **接続を適切にリリースする**:

   ```typescript
   try {
     const result = await client.execute("SELECT * FROM users");
     return result;
   } finally {
     // libSQLクライアントは自動的に接続を管理
     // Embedded Replicasの場合は定期的に同期
   }
   ```

3. **同期設定を最適化する**:
   ```typescript
   const config = {
     syncInterval: 60, // 同期間隔（秒）
     syncOnWrite: true, // 書き込み時に同期
     readYourWrites: true, // 自分の書き込みを即座に読み取り
   };
   ```

### 避けるべきこと

1. **接続のリーク**:
   - ❌ 接続を閉じ忘れる
   - ✅ try-finallyで確実にリリース

2. **不適切な同期設定**:
   - ❌ 同期間隔が短すぎる（ネットワーク負荷）
   - ✅ アプリケーション要件に応じた適切な間隔

3. **Embedded Replicasの未活用**:
   - ❌ サーバーレス環境で常にリモート接続
   - ✅ Embedded Replicasでローカル読み取り + クラウド同期

## トラブルシューティング

### 問題1: 同期エラー

**症状**: Embedded Replicasの同期が失敗

**原因**:

- ネットワーク接続の問題
- 認証トークンの期限切れ
- 同期URLの設定ミス

**解決策**:

```typescript
// 同期状態の確認
const syncStatus = await client.sync();
console.log("Sync completed:", syncStatus);

// 手動で強制同期
await client.sync();

// 同期エラーのハンドリング
client.on("sync-error", (error) => {
  console.error("Sync failed:", error);
  // リトライロジック
});
```

### 問題2: 接続タイムアウト

**症状**: Tursoへの接続がタイムアウト

**原因**:

- ネットワーク遅延
- 認証トークンの問題
- リージョンが遠い

**解決策**:

```typescript
// Embedded Replicasを使用してローカル接続
const client = createClient({
  url: "file:local.db",
  syncUrl: process.env.TURSO_DATABASE_URL,
  authToken: process.env.TURSO_AUTH_TOKEN,
});

// リトライ戦略
const retryConfig = {
  retries: 3,
  factor: 2,
  minTimeout: 1000,
  maxTimeout: 5000,
};
```

### 問題3: コールドスタートの遅延

**症状**: Lambda/Edgeの初回リクエストが遅い

**原因**:

- リモートDB接続の確立
- HTTPS通信のオーバーヘッド
- 認証処理

**解決策**:

- Embedded Replicasの使用（ローカルファイルアクセス）
- Provisioned Concurrencyの使用
- クライアントインスタンスのキャッシング

## 関連スキル

- **.claude/skills/query-performance-tuning/SKILL.md** (`.claude/skills/query-performance-tuning/SKILL.md`): クエリ最適化
- **.claude/skills/backup-recovery/SKILL.md** (`.claude/skills/backup-recovery/SKILL.md`): バックアップ戦略

## メトリクス

### 接続プール健全性指標

| 指標           | 目標値  | 警告値  |
| -------------- | ------- | ------- |
| 接続使用率     | < 80%   | > 90%   |
| 待機リクエスト | 0       | > 10    |
| 接続エラー率   | < 0.1%  | > 1%    |
| 平均接続時間   | < 100ms | > 500ms |

## 変更履歴

| バージョン | 日付       | 変更内容                  |
| ---------- | ---------- | ------------------------- |
| 1.0.0      | 2025-11-27 | 初版作成 - 接続プール管理 |

## 参考文献

- **Turso Documentation**: https://docs.turso.tech/
- **libSQL**: https://github.com/tursodatabase/libsql
- **Embedded Replicas**: https://docs.turso.tech/features/embedded-replicas
