准备好的语句在存储过程中使用时是否应该解除分配?

时间:2009-07-22 12:31:15

标签: 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 gcbnStatement USING @companyName;
  DEALLOCATE PREPARE gcbnStatement;
END $$

那么 - DEALLOCATE语句应该存在吗?干杯!

/维克多

4 个答案:

答案 0 :(得分:6)

根据MySQL docs

  

准备好的声明特定于   它创建的会话。   如果你没有终止会话   解除以前准备的   声明,服务器解除分配它   自动。

所以,不,我不打算明确地去做,除非你有非常长时间的会话。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我也遇到了同样的问题,在文档中提到了

A prepared statement is also global to the session. If you create a prepared statement within a stored routine, it is not deallocated when the stored routine ends.

我起初以为这意味着应该明确地释放它。

但事实并非如此。

答案 3 :(得分:0)

在存储例程中释放准备好的语句是最佳实践。

准备好的语句对会话来说是全局的,并且不会在存储的例程结束时自动释放。

如果您有太多已创建但未释放的准备好的语句,您可能会遇到/超过 max_prepared_stmt_count 限制