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不释放它们不是一件好事吗?因为这样,在下次数据库连接中使用存储过程时,不必重新编译存储过程,这有意义吗?这不可能是正确的:如果由于池而重复使用连接会暴露与前一个会话相关的任何信息,这将是一个基本的安全风险。因此,会话结束时记录的解除分配必须在从池重新使用连接之前发生。