[PHP]DB2接続を閉じる:db2_close関数の完全解説!

PHP

こんにちは!今回は、PHPのdb2_close関数について詳しく解説します。DB2データベース接続を適切に閉じるための重要な関数です。

1. db2_close関数の基本情報

構文

db2_close ( resource $connection ): bool

基本説明

  • DB2データベース接続を閉じます
  • 成功時はtrue、失敗時はfalseを返します
  • リソースの解放に重要な役割を果たします

2. 基本的な使用例

シンプルな使用例

<?php
$conn = db2_connect($database, $username, $password);

if ($conn) {
    // データベース操作

    // 接続を閉じる
    if (db2_close($conn)) {
        echo "接続を正常に閉じました";
    } else {
        echo "接続を閉じる際にエラーが発生しました";
    }
}

try-catchでの使用

<?php
$conn = null;
try {
    $conn = db2_connect($database, $username, $password);
    // データベース操作
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
} finally {
    if ($conn) {
        db2_close($conn);
    }
}

3. 実践的な使用例

データベース接続管理クラス

<?php
class DB2Connection {
    private $conn;
    private $isConnected = false;

    public function __construct(
        string $database,
        string $username,
        string $password
    ) {
        $this->connect($database, $username, $password);
    }

    private function connect(
        string $database,
        string $username,
        string $password
    ): void {
        $this->conn = db2_connect($database, $username, $password);
        if ($this->conn) {
            $this->isConnected = true;
        } else {
            throw new RuntimeException("DB2接続エラー");
        }
    }

    public function close(): void {
        if ($this->isConnected && $this->conn) {
            if (!db2_close($this->conn)) {
                throw new RuntimeException("接続を閉じる際にエラーが発生しました");
            }
            $this->isConnected = false;
            $this->conn = null;
        }
    }

    public function __destruct() {
        $this->close();
    }

    public function getConnection() {
        return $this->conn;
    }
}

接続プール管理

<?php
class DB2ConnectionPool {
    private static $connections = [];
    private static $maxConnections = 10;

    public static function getConnection(array $config): ?resource {
        $key = md5(serialize($config));

        if (!isset(self::$connections[$key])) {
            if (count(self::$connections) >= self::$maxConnections) {
                // 最も古い接続を閉じる
                $oldestKey = array_key_first(self::$connections);
                self::closeConnection($oldestKey);
            }

            $conn = db2_connect(
                $config['database'],
                $config['username'],
                $config['password']
            );

            if ($conn) {
                self::$connections[$key] = [
                    'connection' => $conn,
                    'lastUsed' => time()
                ];
            }
        }

        return self::$connections[$key]['connection'] ?? null;
    }

    public static function closeConnection(string $key): void {
        if (isset(self::$connections[$key])) {
            db2_close(self::$connections[$key]['connection']);
            unset(self::$connections[$key]);
        }
    }

    public static function closeAll(): void {
        foreach (array_keys(self::$connections) as $key) {
            self::closeConnection($key);
        }
    }
}

トランザクション管理との組み合わせ

<?php
class DB2TransactionManager {
    private $conn;

    public function __construct(resource $connection) {
        $this->conn = $connection;
    }

    public function executeTransaction(callable $callback) {
        try {
            db2_autocommit($this->conn, DB2_AUTOCOMMIT_OFF);

            $result = $callback($this->conn);

            db2_commit($this->conn);
            return $result;
        } catch (Exception $e) {
            db2_rollback($this->conn);
            throw $e;
        } finally {
            db2_autocommit($this->conn, DB2_AUTOCOMMIT_ON);
        }
    }

    public function close(): void {
        if ($this->conn) {
            db2_close($this->conn);
            $this->conn = null;
        }
    }
}

4. エラー処理

<?php
function safelyCloseConnection($conn): bool {
    try {
        if (!$conn) {
            throw new InvalidArgumentException("無効な接続リソース");
        }

        if (!db2_close($conn)) {
            throw new RuntimeException(
                "接続を閉じる際にエラーが発生: " . db2_conn_errormsg()
            );
        }

        return true;
    } catch (Exception $e) {
        error_log("DB2接続クローズエラー: " . $e->getMessage());
        return false;
    }
}

5. 便利なユーティリティ関数

接続状態チェッカー

<?php
class DB2ConnectionChecker {
    public static function isConnectionActive($conn): bool {
        if (!$conn) {
            return false;
        }

        try {
            $result = db2_exec($conn, "SELECT 1 FROM SYSIBM.SYSDUMMY1");
            return $result !== false;
        } catch (Exception $e) {
            return false;
        }
    }

    public static function closeIfActive($conn): bool {
        if (self::isConnectionActive($conn)) {
            return db2_close($conn);
        }
        return true;
    }
}

6. 注意点とTips

  1. リソース管理
<?php
// 確実に接続を閉じる
register_shutdown_function(function() use ($conn) {
    if ($conn) {
        db2_close($conn);
    }
});
  1. メモリリーク防止
  • 未使用の接続は速やかに閉じる
  • 長時間のスクリプト実行時は定期的に接続をチェック
  1. ベストプラクティス
  • トランザクション完了後に接続を閉じる
  • エラー発生時も確実に接続を閉じる
  • 接続プールを使用する場合は適切な管理を行う

まとめ

db2_close関数は、DB2データベース接続を適切に終了するための重要な関数です。以下のような点に注意して使用しましょう:

  • リソースの適切な解放
  • エラー処理の実装
  • トランザクション管理との連携
  • メモリリークの防止

適切な接続管理は、アプリケーションのパフォーマンスと安定性に大きく影響します。

ぜひ、これらの例を参考に、みなさんのプロジェクトでも活用してみてください!

タイトルとURLをコピーしました