11

使用后是否应该释放 PDO 准备好的语句?如果是这样,怎么办?具体来说,我问的是 MySQL - 你怎么能,你应该如何DEALLOCATE PREPARE通过 PDO 调用。(编辑:澄清一下,这个问题不是指模拟的准备,而是真正的准备。)

另外 - 这会释放结果集(当大时)?

解释:

我看过代码

$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;

这让我想知道这是做什么的,什么时候,如果 funset($stmnt);会不同?

手册指出

准备好查询后,数据库将分析、编译和优化其执行查询的计划。[...] 通过使用准备好的语句,应用程序避免了重复分析/编译/优化循环。

这往往建议您应该取消分配语句,并且 MySQL 具有此功能。所以,

  1. 你能打电话吗?怎么DEALLOCATE PREPARE打电话
  2. 你应该这样做吗?
  3. 任何人都可以确认将语句设置为 null(或取消设置语句)与 mysql_ 和 mysqli_ 的“free_result”相同吗?
  4. 它是立即发生,还是等待垃圾收集器启动?

为了完整起见,另一个提到“free_result”和“close”函数的SO问题mysqli_()表明释放语句实际上会增加时间(除非您有大量内存使用并且需要空间)。但是“free_result”不同于将 SQL 服务器从缓存准备好的语句中释放出来。

4

2 回答 2

4

使用后是否应该释放 PDO 准备好的语句?如果是这样,怎么办?

在 MySQL 的上下文中?没有为什么?

PDO默认模拟准备好的语句。这意味着 PDO 本身会执行参数替换、转义等操作,并将 SQL 块向下发送,而不是使用本机准备好的语句。

虽然您可以打开它,但您仍然不需要明确关闭句柄,除非您还使用无缓冲查询。仅仅让语句句柄超出范围或将其设置为 null不会关闭游标。同样,这在您使用无缓冲查询时才重要。如果不是,那么让它超出范围或将其设置为 null 就足以干净地关闭句柄。

您还链接到DEALLOCATE PREPARE. 只有在使用 SQL 字符串手动调用时才需要该语法。这是一个完全独立于MySQL C-level API-based Prepared statements 的操作,这是使用的。(好吧,也许你正在使用,但它实际上是同一件事。)PREPAREPDO_MYSQLmysqlnd

于 2012-12-08T06:50:09.107 回答
1

是的。完成准备语句后,您可以将其设置为NULL或使用unset().

对于具有多个查询和大型数据库的脚本,这会有所不同。您可以使用以下方法进行测试:

$before = memory_get_usage();
$stmt = NULL;
die(memory_get_usage() - $before);

对我来说,这节省了 20MB 的内存,这让脚本后来崩溃了。

于 2016-05-18T17:07:49.887 回答