释放PDO准备的语句(DEALLOCATE PREPARE)

PDO准备好的陈述应该在使用后释放出来吗? 如果是这样,怎么样? 具体来说,我正在询问关于MySQL的内容 - 你应该怎样,并且应该通过PDO调用DEALLOCATE PREPARE 。 (编辑:为了澄清,这个问题不是指模拟的准备,而是真正的准备。)

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

说明:

我已经看到了代码

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

这导致我想知道这是什么,何时以及如果unset($stmnt); 会不一样?

手册指出

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

这往往表明你应该不分配该语句,并且MySQL有能力。 所以,

  • 你可以打电话DEALLOCATE PREPARE ,以及如何
  • 你应该这样做吗?
  • 任何人都可以确认设置语句为null(或不设置语句)将执行与mysql_和mysqli_的“free_result”相同的操作吗?
  • 它是否立即发生,还是等待垃圾收集器启动?

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


    PDO准备好的陈述应该在使用后释放出来吗? 如果是这样,怎么样?

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

    PDO默认模拟预准备语句。 这意味着PDO本身会执行参数替换,转义等操作,并将SQL的块发送到队列中,而不是使用本机预处理语句。

    虽然可以打开它,但除非使用未缓冲的查询,否则不需要明确关闭句柄。 仅仅让语句句柄超出范围或将其设置为null将不会关闭游标。 同样,这只在你使用未缓冲的查询时才重要。 如果你不是,那么让它超出范围或将其设置为空就足以完全关闭手柄。

    您还链接到DEALLOCATE PREPARE 。 只有在用SQL字符串手动调用PREPARE时才需要该语法。 这是一个完全独立的操作,而不是基于MySQL C级API的预准备语句,这正是PDO_MYSQL正在使用的语句。 (好吧,也许你正在使用mysqlnd ,但它实际上是一回事。)


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

    对于具有多个查询和大型数据库的脚本,这会有所不同。 你可以测试:

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

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

    链接地址: http://www.djcxy.com/p/66705.html

    上一篇: Freeing up PDO prepared statements (DEALLOCATE PREPARE)

    下一篇: PDO prepared statements with bit fields