获取错误:[Err] 1615 - 需要使用 MySQL 5.6.30 重新准备准备好的语句

Abd*_*naf 8 mysql dynamic-sql view prepared-statement mysql-5.6

问题/问题:获取错误: [Err] 1615 - Prepared statement needs to be re-prepared

我有一个存储过程,其中包含一个准备好的语句和一个视图

DROP PROCEDURE IF EXISTS `sampleProc`;

DELIMITER ;;
CREATE DEFINER = `root`@`localhost` PROCEDURE `sampleProc`()
BEGIN

SET @select = "SELECT * FROM `viewSample` ";

  PREPARE stmt FROM @select ;
  EXECUTE stmt ;
  DEALLOCATE PREPARE stmt ;

END  ;;
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

以下调用有时会出错 CALL sampleProc();

可能的解决方法/解决方案

看来最好的解决方案是增加 table_definition_cache 的值,但似乎不起作用,因为它已经从 1400(默认)增加到 16384。 table_open_cache 也增加到 32162

Variable_name               Value
table_definition_cache      16384
table_open_cache            32162
table_open_cache_instances  4
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 7

这似乎是一个持续存在的问题

使用动态 SQL 处理视图很麻烦

最早的错误是11 年前无法在准备好的语句中创建视图。有一个补丁来解决它

另一个错误报告,Prepared-Statement failed when MySQL-Server under load指出,当底层表繁忙时,错误 1615 不是错误。(真的 ?)

虽然增加表缓存大小有一些好处(请参阅使用 mysql 视图时的 MySql 错误),但它并不总是有效(请参阅一般错误:1615 准备好的语句需要重新准备(选择 mysql 视图)

备择方案

一年多以前,有人在MySQL 论坛中提到过这个(MySql“视图”、“准备好的语句”和“准备好的语句需要重新准备”)

有人提出了一个简单的想法,即不在准备好的语句中使用视图,而是在子查询中使用视图的 SQL。另一个想法是创建视图使用的 SQL 并在您的客户端代码中执行它

这些似乎是更好的解决方法,只是增加了表缓存大小。