こんにちは!今回は、DB2データベースのdb2_free_stmt
関数について、実践的に解説します。この関数は、プリペアドステートメントのリソースを解放するために使用します。
db2_free_stmtとは?🔄
プリペアドステートメントに関連付けられたリソースを解放する関数です。メモリリークを防ぎ、効率的なリソース管理を実現します。
基本的な使い方
bool db2_free_stmt ( resource $stmt )
基本的な使用例
例1:シンプルな使用方法
$sql = "SELECT * FROM employees WHERE dept_id = ?";
$stmt = db2_prepare($connection, $sql);
db2_bind_param($stmt, 1, $dept_id, DB2_PARAM_IN);
db2_execute($stmt);
// データ処理後、ステートメントを解放
db2_free_stmt($stmt);
実践的な使用例
例1:プリペアドステートメントの再利用
function processEmployees($connection, $departments) {
$sql = "SELECT * FROM employees WHERE department = ?";
$stmt = db2_prepare($connection, $sql);
try {
foreach ($departments as $dept) {
db2_bind_param($stmt, 1, $dept, DB2_PARAM_IN);
db2_execute($stmt);
while ($row = db2_fetch_assoc($stmt)) {
processEmployee($row);
}
}
} finally {
// ステートメントを必ず解放
db2_free_stmt($stmt);
}
}
例2:複数のステートメント管理
class StatementManager {
private $statements = [];
public function prepare($connection, $sql) {
$stmt = db2_prepare($connection, $sql);
$this->statements[] = $stmt;
return $stmt;
}
public function freeAll() {
foreach ($this->statements as $stmt) {
if ($stmt) {
db2_free_stmt($stmt);
}
}
$this->statements = [];
}
public function __destruct() {
$this->freeAll();
}
}
例3:トランザクション処理
function executeTransaction($connection) {
$stmts = [];
try {
db2_autocommit($connection, DB2_AUTOCOMMIT_OFF);
// 複数のステートメントを準備
$stmts[] = db2_prepare($connection, "INSERT INTO table1 VALUES (?)");
$stmts[] = db2_prepare($connection, "UPDATE table2 SET col = ? WHERE id = ?");
// 処理実行
db2_bind_param($stmts[0], 1, $value1, DB2_PARAM_IN);
db2_execute($stmts[0]);
db2_bind_param($stmts[1], 1, $value2, DB2_PARAM_IN);
db2_bind_param($stmts[1], 2, $id, DB2_PARAM_IN);
db2_execute($stmts[1]);
db2_commit($connection);
} catch (Exception $e) {
db2_rollback($connection);
throw $e;
} finally {
// すべてのステートメントを解放
foreach ($stmts as $stmt) {
if ($stmt) {
db2_free_stmt($stmt);
}
}
}
}
エラーハンドリングとリソース管理
1. 安全なステートメント解放
function safelyFreeStatement($stmt) {
try {
if ($stmt && is_resource($stmt)) {
return db2_free_stmt($stmt);
}
} catch (Exception $e) {
error_log("ステートメント解放エラー: " . $e->getMessage());
}
return false;
}
2. 複数ステートメントの管理
class PreparedStatements {
private $statements = [];
public function add($stmt) {
$this->statements[] = $stmt;
}
public function freeAll() {
foreach ($this->statements as $key => $stmt) {
if (safelyFreeStatement($stmt)) {
unset($this->statements[$key]);
}
}
}
}
メモリ管理のベストプラクティス 🔧
1. 即時解放パターン
function quickPreparedQuery($connection, $sql, $params) {
$stmt = db2_prepare($connection, $sql);
try {
foreach ($params as $index => $param) {
db2_bind_param($stmt, $index + 1, $param, DB2_PARAM_IN);
}
$result = db2_execute($stmt);
return $result;
} finally {
db2_free_stmt($stmt);
}
}
2. ステートメントプール
class StatementPool {
private static $pool = [];
public static function get($connection, $sql) {
$key = md5($sql);
if (!isset(self::$pool[$key])) {
self::$pool[$key] = db2_prepare($connection, $sql);
}
return self::$pool[$key];
}
public static function freeAll() {
foreach (self::$pool as $stmt) {
db2_free_stmt($stmt);
}
self::$pool = [];
}
}
Tips & 注意点 💡
1. リソースリーク防止
function preventResourceLeak($connection, $sql) {
$stmt = null;
try {
$stmt = db2_prepare($connection, $sql);
// 処理
} finally {
if ($stmt) {
db2_free_stmt($stmt);
}
}
}
2. 条件付きステートメント解放
function conditionalFree($stmt, $condition) {
if ($condition && $stmt) {
return db2_free_stmt($stmt);
}
return false;
}
まとめ
db2_free_stmt
はプリペアドステートメントのリソース解放に重要- try-finallyブロックでの確実な解放を心がける
- 複数のステートメントを適切に管理する
- メモリリークを防ぐために必ず使用する
適切なリソース管理でアプリケーションのパフォーマンスを維持しましょう!
Happy Coding! 😊