こんにちは!今回は、DB2データベースのdb2_free_result
関数について、メモリ管理の観点から詳しく解説します。
db2_free_resultとは?🔄
この関数は、DB2のクエリ結果に関連付けられたリソースを解放するために使用します。メモリの効率的な管理に重要な役割を果たします。
基本的な使い方
bool db2_free_result ( resource $stmt )
基本的な使用例
例1:シンプルな使用方法
$sql = "SELECT * FROM employees";
$stmt = db2_exec($connection, $sql);
while ($row = db2_fetch_assoc($stmt)) {
// データ処理
}
// 結果セットの解放
db2_free_result($stmt);
実践的な使用例
例1:大規模データ処理
function processLargeTable($connection) {
try {
$sql = "SELECT * FROM large_table";
$stmt = db2_exec($connection, $sql);
while ($row = db2_fetch_assoc($stmt)) {
processRow($row);
}
} finally {
// 必ず結果セットを解放
if (isset($stmt) && $stmt) {
db2_free_result($stmt);
}
}
}
例2:複数クエリの実行
function multipleQueries($connection) {
$queries = [
"SELECT * FROM table1",
"SELECT * FROM table2",
"SELECT * FROM table3"
];
foreach ($queries as $sql) {
$stmt = db2_exec($connection, $sql);
try {
while ($row = db2_fetch_assoc($stmt)) {
// データ処理
}
} finally {
db2_free_result($stmt);
}
}
}
例3:エラーハンドリング付き処理
function safeQueryExecution($connection, $sql) {
$stmt = null;
try {
$stmt = db2_exec($connection, $sql);
if (!$stmt) {
throw new Exception("クエリ実行エラー");
}
$results = [];
while ($row = db2_fetch_assoc($stmt)) {
$results[] = $row;
}
return $results;
} catch (Exception $e) {
error_log("Error: " . $e->getMessage());
return false;
} finally {
// 常に結果セットを解放
if ($stmt) {
db2_free_result($stmt);
}
}
}
メモリ管理のベストプラクティス 🔧
1. 即時解放パターン
function quickQuery($connection, $sql) {
$stmt = db2_exec($connection, $sql);
$result = db2_fetch_assoc($stmt);
db2_free_result($stmt);
return $result;
}
2. ジェネレータを使用したメモリ効率の良い実装
function yieldResults($connection, $sql) {
$stmt = db2_exec($connection, $sql);
try {
while ($row = db2_fetch_assoc($stmt)) {
yield $row;
}
} finally {
db2_free_result($stmt);
}
}
// 使用例
foreach (yieldResults($connection, "SELECT * FROM large_table") as $row) {
processRow($row);
}
3. クラスでの管理
class QueryExecutor {
private $stmt;
public function __construct($connection, $sql) {
$this->stmt = db2_exec($connection, $sql);
}
public function getResults() {
$results = [];
while ($row = db2_fetch_assoc($this->stmt)) {
$results[] = $row;
}
return $results;
}
public function __destruct() {
if ($this->stmt) {
db2_free_result($this->stmt);
}
}
}
Tips & 注意点 💡
1. リソースリーク防止
function preventResourceLeak($connection) {
$stmts = [];
try {
// 複数のクエリ実行
for ($i = 0; $i < 3; $i++) {
$stmts[] = db2_exec($connection, "SELECT * FROM table$i");
}
// 処理
} finally {
// すべての結果セットを確実に解放
foreach ($stmts as $stmt) {
if ($stmt) {
db2_free_result($stmt);
}
}
}
}
2. 条件付き解放
function conditionalRelease($stmt, $condition) {
if ($condition && $stmt) {
return db2_free_result($stmt);
}
return false;
}
3. エラーログ付き解放
function loggedRelease($stmt) {
if ($stmt) {
if (!db2_free_result($stmt)) {
error_log("結果セットの解放に失敗しました");
return false;
}
return true;
}
return false;
}
まとめ
db2_free_result
は重要なメモリ管理ツール- 必ず使用後は結果セットを解放する
- try-finallyブロックでの確実な解放を心がける
- 大規模データ処理時は特に重要
メモリリークを防ぎ、アプリケーションのパフォーマンスを維持するために、db2_free_result
を適切に使用しましょう。
Happy Coding! 😊