# 画面設計書 157-接続プールクリア

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける接続プールクリア機能の設計を定義する。.NET SqlClientが管理するSQL Server接続プールをクリアし、接続関連の問題を解決する。

### 本画面の処理概要

本機能は、指定されたコンピュータ上の.NET SqlClient接続プールをクリアし、古いまたは問題のある接続を破棄して新しい接続を強制的に作成させる。

**業務上の目的・背景**：接続プールには、古い接続や問題のある接続が残存し、断続的な接続障害、認証エラー、パフォーマンス問題を引き起こすことがある。本機能は、接続プールをクリアすることでこれらの問題を解決し、すべてのSQL Server接続をリフレッシュする。アクティブな接続は破棄対象としてマークされ、クローズ時にプールに戻らず破棄される。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから以下のコマンドを実行してアクセスする：
- `Clear-DbaConnectionPool` - ローカル接続プールクリア
- `Clear-DbaConnectionPool -ComputerName <コンピュータ名>` - リモート接続プールクリア

**主要な操作・処理内容**：
1. 対象コンピュータ（ローカルまたはリモート）を特定
2. [Microsoft.Data.SqlClient.SqlConnection]::ClearAllPools() を実行
3. すべてのプール済み接続を破棄対象としてマーク
4. 次回接続時に新しい接続を作成

**画面遷移**：
- 本機能はスタンドアロンで動作し、他の機能への直接的な画面遷移はない
- パイプラインで複数コンピュータを処理可能

**権限による表示制御**：
- リモートコンピュータの場合、PowerShellリモーティング権限が必要
- Credentialパラメータで代替資格情報を指定可能

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 77 | Clear-DbaConnectionPool | 主機能 | 接続プールのクリア |

## 画面種別

操作実行

## URL/ルーティング

PowerShellコマンドレット:
- `Clear-DbaConnectionPool`

## 入出力項目

### Clear-DbaConnectionPool パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|------|------|------|
| ComputerName | DbaInstanceParameter[] | No | 対象コンピュータ（デフォルト: ローカル） |
| Credential | PSCredential | No | 代替資格情報 |
| EnableException | switch | No | 例外処理の有効化 |

## 表示項目

### Clear-DbaConnectionPool 出力プロパティ

本コマンドは出力を返さない（None）。成功時は何も出力せず、失敗時のみエラーメッセージを出力する。

## イベント仕様

### 1-Clear-DbaConnectionPool実行

1. ComputerNameパラメータの評価（デフォルト: $env:COMPUTERNAME）
2. ローカル/リモートの判定（IsLocalhost）
3. リモートの場合：
   - Invoke-Command2でリモートスクリプトブロック実行
   - [Microsoft.Data.SqlClient.SqlConnection]::ClearAllPools() をリモート実行
4. ローカルの場合：
   - Invoke-Command2でローカルスクリプトブロック実行
   - [Microsoft.Data.SqlClient.SqlConnection]::ClearAllPools() をローカル実行
5. 成功時は何も出力せず、失敗時はStop-Function実行

## データベース更新仕様

### 操作別データベース影響一覧

本機能はデータベースへの直接アクセスを行わない。.NETランタイムの接続プールを操作する。

| 操作（イベント） | 対象 | 操作種別 | 概要 |
|----------------|------|---------|------|
| Clear-DbaConnectionPool | .NET接続プール | ClearAllPools() | すべての接続プールをクリア |

## メッセージ仕様

| メッセージID | レベル | 条件 | メッセージ内容 |
|-------------|--------|------|---------------|
| - | Verbose | リモートクリア時 | "Clearing all pools on remote computer {computer}" |
| - | Verbose | ローカルクリア時 | "Clearing all local pools" |
| - | Error | 失敗時 | "Failure" |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| Invoke-Command2失敗 | Stop-Function実行、処理継続 |

## 備考

- Microsoft.Data.SqlClientを使用（System.Data.SqlClientではない）
- ClearAllPools()はすべてのプール済み接続を破棄対象としてマーク
- アクティブな接続はクローズ時に破棄され、プールに戻らない
- 新しい接続は次回接続時に新規作成される
- 参考資料:
  - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools(v=vs.110).aspx

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本機能は出力を持たないため、入力パラメータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Clear-DbaConnectionPool.ps1 | `public/Clear-DbaConnectionPool.ps1` | 55-62行目: param()ブロックでパラメータ定義 |

**読解のコツ**: デフォルト値 $env:COMPUTERNAME に注目。Aliasでcn, host, Serverも使用可能。

#### Step 2: エントリーポイントを理解する

処理の起点となるコマンドレット関数を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Clear-DbaConnectionPool.ps1 | `public/Clear-DbaConnectionPool.ps1` | 64-87行目: process ブロック全体 |

**主要処理フロー**:
1. **67行目**: foreachでComputerName反復
2. **69-75行目**: リモートコンピュータの処理
3. **76-82行目**: ローカルコンピュータの処理
4. **84-86行目**: エラー処理

#### Step 3: リモート/ローカル分岐を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Clear-DbaConnectionPool.ps1 | `public/Clear-DbaConnectionPool.ps1` | 69行目: IsLocalhostプロパティによる分岐 |

**主要処理フロー**:
- **69行目**: $computer.IsLocalhost で判定
- **70-75行目**: リモート時のInvoke-Command2（-ComputerName指定）
- **77-82行目**: ローカル時のInvoke-Command2（-ComputerName省略）
- **72, 74, 79, 81行目**: Credentialの有無による分岐

### プログラム呼び出し階層図

```
Clear-DbaConnectionPool
    |
    +-- foreach ($computer in $ComputerName)
            |
            +-- [IsLocalhost = $false]
            |       |
            |       +-- Invoke-Command2 -ComputerName $computer
            |               |
            |               +-- [Credential指定あり]
            |               |       +-- ScriptBlock実行 (with Credential)
            |               |
            |               +-- [Credential指定なし]
            |                       +-- ScriptBlock実行
            |
            +-- [IsLocalhost = $true]
                    |
                    +-- Invoke-Command2
                            |
                            +-- [Credential指定あり]
                            |       +-- ScriptBlock実行 (with Credential)
                            |
                            +-- [Credential指定なし]
                                    +-- ScriptBlock実行

ScriptBlock内:
    [Microsoft.Data.SqlClient.SqlConnection]::ClearAllPools()
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ComputerName   ------>  IsLocalhost判定  ----+
  (default: local)            |              |
                              |              v
Credential     ------>        |         Invoke-Command2
                              |              |
                              |              v
                              |         ScriptBlock
                              |              |
                              |              v
                              |         [Microsoft.Data.SqlClient.SqlConnection]::ClearAllPools()
                              |              |
                              v              v
                         [成功]          [失敗]
                              |              |
                              v              v
                         (出力なし)     Stop-Function
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Clear-DbaConnectionPool.ps1 | `public/Clear-DbaConnectionPool.ps1` | ソース | 接続プールクリアの主処理 |
| Invoke-Command2.ps1 | `internal/functions/Invoke-Command2.ps1` | ソース | リモート/ローカルコマンド実行 |
