【发布时间】:2012-11-13 14:22:07
【问题描述】:
是否应该在使用后释放 PDO 准备好的语句?如果是这样,怎么办?具体来说,我问的是 MySQL - 你怎么能,你应该如何通过 PDO 致电DEALLOCATE PREPARE。 (编辑:澄清一下,这个问题不是指模拟的准备,而是真正的准备。)
另外 - 这是否会释放结果集(如果很大)?
解释:
我见过类似
的代码$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这让我想知道这是做什么的,什么时候,如果 f unset($stmnt); 会有所不同?
说明书上注明
当查询准备好后,数据库将分析、编译和 优化其执行查询的计划。 [...] 通过使用准备好的 声明应用程序避免重复 分析/编译/优化周期。
这倾向于建议您应该取消分配语句,而 MySQL 具有此功能。所以,
- 你能打电话给
DEALLOCATE PREPARE吗,怎么打 - 你应该这样做吗?
- 任何人都可以确认将语句设置为 null(或取消设置语句)将与 mysql_ 和 mysqli_ 的“free_result”相同吗?
- 是立即发生,还是等待垃圾收集器启动?
为了完整起见,另一个SO question 指的是mysqli_() 的“free_result”和“close”函数,这表明释放语句实际上会增加时间(除非您有大量内存使用并需要空间)。但是“free_result”不同于将 SQL 服务器从准备好的语句缓存中释放出来。
【问题讨论】:
-
你是不是专门关掉了仿真准备?默认情况下,准备好的语句在驱动程序中模拟,并在请求结束时被释放(当一切都是 GCd 时)。无论如何,故意释放他们有什么意义?通过在可能的情况下重用准备好的语句来提高性能。为了解决第 3 点,free_result is called when a statement is destroyed(未设置、请求结束等) - 未经测试,我相信 dtor 会立即被调用。
-
是的,我没有模仿准备 - 抱歉,应该在问题中明确说明(但否则问题毫无意义)。为什么要释放他们?因为有几个单独调用的语句不再用于该连接 - 所以它们也可以被释放(优化不被缓存)。那些确实被重复使用的我会保留(直到不再需要,然后同样的问题适用于如何释放它们)。
标签: php mysql pdo prepared-statement