使用后是否应释放PDO准备好的语句?如果是这样,怎么办?具体来说,我在问MySQL-您如何以及应该如何通过PDO调用DEALLOCATE PREPARE。 (编辑:为澄清起见,此问题不是指模拟准备,而是实际准备。)
另外-这样可以释放结果集(大时)吗?
说明:
我已经看到了类似的代码
$stmnt = $db->prepare($sql);
$stmnt->execute($aParams);
$stmnt = null;
这使我想知道这是什么功能,什么时候以及f unset($stmnt);是否会有所不同?
手册指出
When the query is prepared, the database will analyze, compile and
optimize its plan for executing the query. [...] By using a prepared
statement the application avoids repeating the
analyze/compile/optimize cycle.
这倾向于建议您取消分配该语句,而MySQL具有此功能。所以,
你可以打电话给DEALLOCATE PREPARE以及如何
你应该做吗?
谁能确认将mysql_和mysqli_的设置语句设置为null(或取消设置语句)是否与" free_result"相同?
它会立即发生,还是在等待垃圾收集器启动?
为了完整起见,另一个SO问题涉及mysqli_()的" free_result"和" close"函数,建议释放该语句实际上会增加时间(除非您占用大量内存并需要空间)。但是" free_result"与释放SQL Server缓存已准备好的语句不同。
您是否专门关闭了模拟准备? 默认情况下,准备好的语句在驱动程序中模拟,并在请求结束时释放(当所有内容均为GCd时)。 故意释放它们的意义何在? 通过在可能的情况下重新使用准备好的语句,可以提高性能。 要解决第3点,在销毁一条语句(未设置,请求结束等)时调用free_result-未经测试,我相信dtor会立即被调用。
是的,我没有模仿准备-抱歉,应该在问题中阐明这一点(但否则问题是没有意义的)。 为什么要释放它们? 因为有几个单独的被调用的语句不再用于该连接-因此它们也很可能被释放(优化不会被缓存)。 那些确实会被重用的东西会保留下来(直到不再需要为止,然后同样的问题适用于如何释放它们)。
Should PDO prepared statements be freed up after use? And if so, how?
在MySQL的上下文中?没有为什么?
默认情况下,PDO模拟准备好的语句。这意味着PDO本身会进行参数替换,转义等操作,并沿行发送SQL块,而不是使用本机准备好的语句。
虽然可以将其打开,但是除非您还使用无缓冲查询,否则仍然不需要明确关闭该句柄。仅让语句句柄超出范围或将其设置为null不会关闭游标。同样,这仅在使用无缓冲查询时才重要。如果不是,那么让它超出范围或将其设置为null足以完全关闭句柄。
您还链接到DEALLOCATE PREPARE。仅当使用SQL字符串手动调用PREPARE时才需要该语法。这是与PDO_MYSQL使用的基于MySQL C级基于API的预准备语句相比完全独立的操作。 (好的,也许您正在使用mysqlnd,但这实际上是同一回事。)
抱歉-我应该澄清我指的是使用真实的预备语句。我找不到源,但是我记得读过,调用" prepare()"确实会向数据库调用" PREAPRE"-这引出了我应该调用DEALLOCATE PREPARE的问题。我将按照您的要求测试是否未调用PREPARE-我的所有查询都已记录在工作中,因此请尽快与您联系。我没有缓冲查询。感谢您的回复-一天后会跟进。
如果在处理C代码(和mysqlnd)使用的线级API时,在任何地方都看到实际的PREPARE SQL,那会很麻烦。那真是太不对劲了,以至于我对它的错感将被震惊数周。
无需戴帽子-我只是按照您的描述检查了日志和日志。 PREPARE不会出现,但是对prepare()的调用会出现-与您链接的C级API匹配。而且mysql_stmt_close(stmt))似乎也立即被调用,大概是在PHP中将stmnt设置为" null"时(显然是有限的测试,但日志中总是紧随其后的是" stmt close")。感谢您的指点-我会做得对,让东方感到不适。
是。完成prepare语句后,可以将其设置为NULL或使用unset()。
对于具有多个查询和大型数据库的脚本,这会有所不同。您可以测试:
$before = memory_get_usage();
$stmt = NULL;
die(memory_get_usage() - $before);
对我来说,这节省了20MB的内存,后来使脚本崩溃了。
问题不是关于pdo语句,而是关于准备好的语句。在保存20MB的同时,您应该一直在使用无缓冲查询
这与PDOStatement有关,既是预准备的语句,也是结果集。也许将它们分开会更优雅。无缓冲查询引入了其他设计约束。具体来说,您可能没有在连接上打开多个活动的非缓冲查询,这在我的应用程序中是不可接受的约束。