我应该在获取后手动关闭DB Connection和Statement的光标吗?

时间:2015-10-02 17:06:32

标签: php doctrine-orm dbal

我正在使用Mysql数据库为Silex和Doctrine DBAL构建一些东西。

我想知道在完成一个语句和数据库连接之后关闭语句和数据库连接的光标是否是最佳做法。例如:

$sql = '
    SELECT
        `id`, `userid`, `name`, `content` 
    FROM 
        `pages` p 
    WHERE 
        p.`userid` in (?)'; 

$stmt = $conn->executeQuery(
    $sql,
    [$userIds],
    [\Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
);

$rows = $stmt->fetchAll();

$stmt->closeCursor();

$conn->close();

我找不到任何这方面的例子。 Silex和Doctrine doc都不使用这些语句,但它们出于某种原因是正确的吗?

1 个答案:

答案 0 :(得分:2)

$stmt->closeCursor() appears只是PDOStatement::closeCursor()的包装,并允许您在需要时重新执行查询:

  

PDOStatement :: closeCursor()释放与服务器的连接   可以发出其他SQL语句,但将语句留在   使其能够再次执行的状态。

     

此方法对不支持的数据库驱动程序很有用   在先前执行时执行PDOStatement对象   PDOStatement对象仍有未获取的行。如果是数据库驱动程序   受到这种限制,问题可能表现在一个   无序错误。

在您发布的示例中,您没有执行多个查询,而是在词语后立即关闭连接。因此,称之为无益。如果您真的关注内存使用情况,那么将$stmt设置为null应该更有效。

Connection::close() appears只是将对象上的连接设置为null:

/**
 * Closes the connection.
 *
 * @return void
 */
public function close()
{
    $this->_conn = null;
    $this->_isConnected = false;
}

它释放了一些内存,因此比调用它更好。但是我希望这个好处可以忽略不计,因为无论如何它都将在脚本终止时关闭。