こんにちは!今回は、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! 😊