Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在存储过程中使用准备好的语句时,是否应该取消分配?_Mysql_Stored Procedures_Prepared Statement - Fatal编程技术网

Mysql 在存储过程中使用准备好的语句时,是否应该取消分配?

Mysql 在存储过程中使用准备好的语句时,是否应该取消分配?,mysql,stored-procedures,prepared-statement,Mysql,Stored Procedures,Prepared Statement,在存储过程中使用准备好的语句时,它们是否应该在过程结束时被释放,或者不重要,为什么 一些代码需要解释: CREATE PROCEDURE getCompanyByName (IN name VARCHAR(100)) NOT DETERMINISTIC BEGIN PREPARE gcbnStatement FROM 'SELECT * FROM Companies WHERE name=? LIMIT 1'; SET @companyName = name; EXECUTE gcb

在存储过程中使用准备好的语句时,它们是否应该在过程结束时被释放,或者不重要,为什么

一些代码需要解释:

CREATE PROCEDURE getCompanyByName (IN name VARCHAR(100))
NOT DETERMINISTIC
BEGIN
  PREPARE gcbnStatement FROM 'SELECT * FROM Companies WHERE name=? LIMIT 1';
  SET @companyName = name;
  EXECUTE gcbnStatement USING @companyName;
  DEALLOCATE PREPARE gcbnStatement;
END $$
那么,DEALLOCATE语句是否应该存在?干杯

/维克托

根据:

事先准备好的声明是针对特定客户的 创建它的会话。 如果您终止会话而没有 解除分配先前准备的 语句,则服务器将其解除分配 自动地


所以,不,除非您有非常长时间运行的会话,否则我不会显式地执行此操作。

如果您使用连接池,取消分配它们肯定是个好主意。

谢谢。。。虽然这不是一个“为什么”,但肯定是最好的答案;)MySQL文档还说:“预处理语句也是会话的全局语句。如果在存储例程中创建预处理语句,则在存储例程结束时不会释放它。”。因此,我会在执行完成后显式释放。@Yasir不释放它们不是一件好事吗?因为这样,在下次数据库连接中使用存储过程时,不必重新编译存储过程,这有意义吗?这不可能是正确的:如果由于池而重复使用连接会暴露与前一个会话相关的任何信息,这将是一个基本的安全风险。因此,会话结束时记录的解除分配必须在从池重新使用连接之前发生。