[PHP]DB2のdb2_free_resultでメモリを効率的に管理!

PHP

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

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