【发布时间】:2019-11-06 00:47:09
【问题描述】:
我得到了错误: 一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。 但是:
- PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 已开启
- 我不使用 pdo 的 query(),只使用 exec()。
我认为“分析表”存在问题。它返回一个带有 on 行的结果集。我不需要这些信息。我无法更改 sql 命令的顺序,因为实际上,cron 作业在夜间调用了不同的批次...
测试代码:
pdo()->exec("TRUNCATE TABLE test;");
pdo()->exec("INSERT INTO test SELECT id FROM data");
// pdo()->exec("INSERT INTO test VALUES (1)"); if only VALUES(..) is used no error thrown
pdo()->exec("ANALYZE TABLE test"); // this returns 1 row
pdo()->beginTransaction(); // here comes the exception!
连接设置:
PDO::ATTR_EMULATE_PREPARES => 1
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 1
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, lc_time_names = 'de_DE',sql_mode ='STRICT_ALL_TABLES,PIPES_AS_CONCAT', group_concat_max_len=1000000" ;
PDO::MYSQL_ATTR_COMPRESS => 1
我实际的 Workarround 是:
$cmd = pdo()->query("ANALYZE TABLE test");
$cmd->closeCursor();
unset($cmd);
是否有任何错误配置或者这是 10.2.22-MariaDB-log 或 PHP 版本 7.2.10 中的错误?
【问题讨论】:
-
我真的希望你的 pdo() 函数返回一个静态实例,而不是每次调用它时都创建一个新的连接。
-
你为什么要
ANALYZE TABLE? (问题的另一个解决方案是摆脱ANALYZE。) -
没有 ANALYZE 性能很弱。