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)
这似乎是一个持续存在的问题
使用动态 SQL 处理视图很麻烦
最早的错误是11 年前无法在准备好的语句中创建视图。有一个补丁来解决它。
另一个错误报告,Prepared-Statement failed when MySQL-Server under load指出,当底层表繁忙时,错误 1615 不是错误。(真的 ?)
虽然增加表缓存大小有一些好处(请参阅使用 mysql 视图时的 MySql 错误),但它并不总是有效(请参阅一般错误:1615 准备好的语句需要重新准备(选择 mysql 视图))
一年多以前,有人在MySQL 论坛中提到过这个(MySql“视图”、“准备好的语句”和“准备好的语句需要重新准备”)。
有人提出了一个简单的想法,即不在准备好的语句中使用视图,而是在子查询中使用视图的 SQL。另一个想法是创建视图使用的 SQL 并在您的客户端代码中执行它。
这些似乎是更好的解决方法,只是增加了表缓存大小。
| 归档时间: |
|
| 查看次数: |
15474 次 |
| 最近记录: |