こんにちは!今回は、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
- リソース管理
<?php
// 確実に接続を閉じる
register_shutdown_function(function() use ($conn) {
if ($conn) {
db2_close($conn);
}
});
- メモリリーク防止
- 未使用の接続は速やかに閉じる
- 長時間のスクリプト実行時は定期的に接続をチェック
- ベストプラクティス
- トランザクション完了後に接続を閉じる
- エラー発生時も確実に接続を閉じる
- 接続プールを使用する場合は適切な管理を行う
まとめ
db2_close関数は、DB2データベース接続を適切に終了するための重要な関数です。以下のような点に注意して使用しましょう:
- リソースの適切な解放
- エラー処理の実装
- トランザクション管理との連携
- メモリリークの防止
適切な接続管理は、アプリケーションのパフォーマンスと安定性に大きく影響します。
ぜひ、これらの例を参考に、みなさんのプロジェクトでも活用してみてください!