问题标签 [unbuffered-queries]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - PDO::query() 遇到“在其他无缓冲查询处于活动状态时无法执行查询”。
也许其他人和我有同样的问题。我遇到了错误:
在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。或者,如果您的代码只针对 mysql 运行,您可以通过设置 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性来启用查询缓冲。
在 PDO 上。正如在许多线程中提到的那样,该错误至少可能是以下问题之一:
closeCursor()
查询游标没有像这里提到的那样关闭;MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询- 一个语句有两个以上的查询,如下所述:PDO Cannot execute queries while other unbuffered queries are active
- 此处提到的 mysql-driver 中的错误:什么导致 PDO 错误无法在其他无缓冲查询处于活动状态时执行查询?
在我的情况下,以上所有都没有帮助,我花了一些时间才解决了这个问题。这是我的代码(伪代码):
在我将其更改为:
它对我有用。查询和执行有什么区别?
为什么在这种情况下 PDO::query() 不起作用?调用时,游标关闭。
mysql - Laravel 4.2 打开第二个数据库连接到主数据库
我的 laravel 应用程序有一个数据库,但出于以下原因,我需要在 Laravel 中打开两个连接。
我有这个代码:
我正在使用无缓冲查询,因为我没有足够的内存来将整个结果集准备到内存中,我们在这里谈论数百万行。但是我需要跟踪已经处理了多少行,所以我有一个函数可以每处理 10K 行就写回状态表。问题是当一个无缓冲的查询正在运行时,在它完成之前你不能写回 MYSQL。
所以我需要做的是让上面的这个无缓冲查询运行一个新的连接,但与应用程序使用的数据库相同。
那么有可能吗?如何在 Laravel 中启动一个新连接到应用程序已经使用的同一数据库而不关闭现有连接?
php - SQLite3 无缓冲查询
我正在将 PHP 中的一些旧代码从 SQLite2 转换为 SQLite3。
其中一行使用以下代码:
是否可以在 SQLite3 中执行无缓冲查询?我似乎在 SQL3 网站上找不到任何东西。
php - 在 PHP 中的 mysql_unbuffered_query 上检测 mysql_fetch_row 中的数据库断开连接
我有一个连接到数据库的代码。它使用 mysql_unbuffered_query 在大表上执行选择语句。它使用 mysql_fetch_row 遍历记录并最终释放结果。有时,运行代码的服务器与网络断开连接,无法访问数据库。如何在使用 mysql_fetch_row 读取记录时检测到这种断开连接?这是示例代码:
php - Laravel 和 MemSQL 列存储,无缓冲查询处于活动状态
我目前正在使用 MemSQL Columnstore 并尝试将其与 laravel 5 集成,但每次我尝试进行查询时都会出现以下错误
SQLSTATE[HY000]:一般错误:2014 在其他无缓冲查询处于活动状态时无法执行查询。考虑使用 PDOStatement::fetchAll()。
我一直在寻找并发现了这个:
不要在 Laravel Eloquent ORM 中使用准备好的语句?
并试图这样做,但没有奏效。这是我的查询
任何指导将不胜感激。
php - Mysqli:use_result 后跳过行
我将任意多语句 SQL 传递给 Mysqli(使用 mysqlnd)并检索结果集。SELECT 语句可以包含LIMIT
(或不包含)子句。我需要的是将获取的行限制为 1000(硬编码限制)。这就是我所拥有的:
如果当前结果中有很多未提取的行,则释放结果需要太多时间。有没有办法告诉MySQL“我不再需要这个结果的剩余行,只是把它埋起来”?
PS。我知道该SQL_SELECT_LIMIT
选项,但是当显然设置了选择限制 ( SELECT * FROM t1 LIMIT 99999999
) 时,此限制将被忽略。
php - PDO 一般错误:2014 无法执行查询,而其他无缓冲查询在尝试锁定表时处于活动状态
我正在将某人的旧代码从 using 更新mysql()
为 using PDO
。在一个地方,他们有一些LOCK TABLES
命令来防止两个用户同时访问相同的数据。运行时LOCK TABLES
,PDO
抛出“一般错误:2014 无法在其他无缓冲查询处于活动状态时执行查询”。
我做了一些测试代码来消除其他变量。系统在 Ubuntu 18 / PHP 7.2 / MySQL 5.7.27 上运行:
我也尝试在$_DB->beginTransaction
之前LOCK TABLES
和$_DB->commit
之后添加一个UNLOCK TABLES
,但我仍然得到同样的错误。
我尝试了 and 的各种组合ATTR_EMULATE_PREPARES
,MYSQL_ATTR_USE_BUFFERED_QUERY
但似乎没有任何区别。
php - 如何运行无缓冲的 SELECT 并同时运行另一个 INSERT?(PHP,MYSQLI_USE_RESULT,命令不同步;您现在无法运行此命令)
我必须从主表中过滤和添加记录。该表有数百万条记录。首先我尝试:
现在我面临的第一个问题是内存溢出。(是的,我曾经相信通常 Php 不会得到所有的记录,而是一个接一个,所以这是一个最小的内存使用,因为一个记录会擦除以前的记录,但是这个人每天都会学到新的东西)。我遇到了一个有用的标志(MYSQLI_USE_RESULT),所以:
但这一次我得到一个悲惨的错误:Commands out of sync; you can't run this command now
。现在,我无法想象如何处理它。即使我将master的记录收集到$array中,仍然内存溢出。我不敢相信我不允许在使用 SELECT FROM 获取时运行 INSERT INTO,我看不出两者发生冲突的方式,这没有任何意义。
php - PDO MYSQL_ATTR_USE_BUFFERED_QUERY 不生效
我有如下粗略代码(完整代码146行,其中90行是字符串解析,需要的可以添加):
$stmt->execute(array('2020-04-25', '2020-05-25'));
我的内存消耗期间是as .34GB
(ps aux | grep 'php ' | awk '{$5=int(100 * $5/1024/1024)/100"GB";}{ print;}'
用于监控期间的消耗select
和show full processlist
SQL端来验证)。一旦脚本进入,while
它就会跳转到 +5 GB。
测试setattribute
好像已经生效了:
但是当我切换缓冲或无缓冲时,行为不会改变。
和
使用echo $db->getAttribute(constant('PDO::MYSQL_ATTR_USE_BUFFERED_QUERY'));
还会显示设置更改。
将设置移动到语句而不是https://www.php.net/manual/en/ref.pdo-mysql.php建议的连接也不起作用。
我还尝试将缓冲区设置移动到没有影响的连接:
取出第二个连接似乎允许无缓冲查询按预期运行:
这种用法memory_get_usage
不超过379999
。
如果我取消注释第二个连接并使其无缓冲,我会收到:
缓冲的第二个连接如最初描述的那样执行,执行时会消耗大量内存。如果ini_set('memory_limit'
是高它工作,如果低它错误。使用大memory_limit
不是一个可行的解决方案。
正在使用 ( Red Hat Enterprise Linux Server release 7.3 (Maipo)
):
将脚本移至较新的机器 ( Amazon Linux release 2 (Karoo)
):
并具有相同的行为。