[PHP]DB2のdb2_pcloseで永続的接続を閉じる!実践ガイド

PHP

こんにちは!今回は、DB2データベースのdb2_pclose関数について、永続的接続の管理の観点から詳しく解説します。

db2_pcloseとは?🔌

永続的なデータベース接続を明示的に閉じるための関数です。通常のdb2_connectではなく、db2_pconnectで確立された接続を終了する際に使用します。

基本的な使い方

bool db2_pclose ( resource $connection )

基本的な使用例

例1:シンプルな使用方法

$connection = db2_pconnect($database, $user, $password);

// データベース操作
$sql = "SELECT * FROM users";
$stmt = db2_exec($connection, $sql);

// 接続を閉じる
db2_pclose($connection);

実践的な使用例

例1:データベース接続管理クラス

class DB2Connection {
    private static $connection = null;
    private static $config = [];

    public static function initialize($config) {
        self::$config = $config;
    }

    public static function getConnection() {
        if (self::$connection === null) {
            self::$connection = db2_pconnect(
                self::$config['database'],
                self::$config['username'],
                self::$config['password']
            );

            if (!self::$connection) {
                throw new Exception("データベース接続エラー");
            }
        }
        return self::$connection;
    }

    public static function close() {
        if (self::$connection) {
            db2_pclose(self::$connection);
            self::$connection = null;
        }
    }

    public static function __destruct() {
        self::close();
    }
}

例2:接続プール管理

class ConnectionPool {
    private static $connections = [];
    private static $config = [];

    public static function initialize($config) {
        self::$config = $config;
    }

    public static function getConnection($name = 'default') {
        if (!isset(self::$connections[$name])) {
            self::$connections[$name] = db2_pconnect(
                self::$config['database'],
                self::$config['username'],
                self::$config['password']
            );
        }
        return self::$connections[$name];
    }

    public static function closeAll() {
        foreach (self::$connections as $name => $conn) {
            if ($conn) {
                db2_pclose($conn);
                unset(self::$connections[$name]);
            }
        }
    }
}

例3:トランザクション管理

class TransactionManager {
    private $connection;

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

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

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

            db2_commit($this->connection);
            return $result;

        } catch (Exception $e) {
            db2_rollback($this->connection);
            throw $e;

        } finally {
            db2_autocommit($this->connection, DB2_AUTOCOMMIT_ON);
        }
    }
}

エラーハンドリング

function safeConnectionClose($connection) {
    try {
        if ($connection && is_resource($connection)) {
            if (!db2_pclose($connection)) {
                throw new Exception("接続クローズエラー");
            }
        }
        return true;

    } catch (Exception $e) {
        error_log("Connection Close Error: " . $e->getMessage());
        return false;
    }
}

接続管理のベストプラクティス 🔧

1. 接続状態の確認

function checkConnection($connection) {
    try {
        $stmt = @db2_exec($connection, "SELECT 1 FROM SYSIBM.SYSDUMMY1");
        return ($stmt !== false);
    } catch (Exception $e) {
        return false;
    }
}

2. 自動再接続

class AutoReconnectConnection {
    private $connection;
    private $config;

    public function getConnection() {
        if (!$this->connection || !checkConnection($this->connection)) {
            if ($this->connection) {
                db2_pclose($this->connection);
            }

            $this->connection = db2_pconnect(
                $this->config['database'],
                $this->config['username'],
                $this->config['password']
            );
        }
        return $this->connection;
    }
}

Tips & 注意点 💡

1. リソースリーク防止

function preventResourceLeak($connection) {
    register_shutdown_function(function() use ($connection) {
        if ($connection) {
            db2_pclose($connection);
        }
    });
}

2. 接続タイムアウト処理

function connectWithTimeout($config, $timeout = 5) {
    $start = time();

    while (time() - $start < $timeout) {
        $connection = @db2_pconnect(
            $config['database'],
            $config['username'],
            $config['password']
        );

        if ($connection) {
            return $connection;
        }

        sleep(1);
    }

    throw new Exception("接続タイムアウト");
}

まとめ

  • db2_pcloseは永続的接続を適切に終了するために使用
  • エラーハンドリングを適切に実装することが重要
  • 接続プールの管理に活用できる
  • リソースリークを防ぐために確実に接続を閉じる

適切な接続管理でアプリケーションの安定性を確保しましょう!

Happy Coding! 😊

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