- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 PDO::ATTR_PERSISTENT = true
时,PDO::exec
和 PDO::query
之间似乎存在差异。当使用PDO::exec
时,连接将不会被重用,并最终导致MySQL出现“连接数过多”错误,因为它们似乎没有被关闭(或重用)。
例如,请参阅这个小代码片段:
<?php
$pdo_attr = [
PDO::ATTR_PERSISTENT => true,
];
$pdo = new PDO("mysql:host=mysql;dbname=empty", "root", "iamreallysecure", $pdo_attr);
// The following will give a to many connections error after a few browser refreshes (connection limit is set to 10)
var_dump($pdo->exec("SELECT 1"));
// While the following does NOT leave >10 connections open and continues to work
//var_dump($pdo->query("SELECT 1")->fetchAll());
exec
会将“休眠”MySQL 查询留在系统上(通过 SHOW PROCESSLIST
观察),而 query
不会触发此操作。
这是预期的吗?在这种情况下,exec 和 query 有什么区别?或者这可能是一个错误?
完全工作的(docker)示例位于 https://github.com/Mattie112/mysqltest
最佳答案
如果您使用 exec()
来执行 SELECT
,那么您就已经做错了。此函数 ( as is mentioned in the manual ) 不会从数据库获取结果。它只能用于不产生结果集且没有变量输入的查询。如果查询产生结果,那么您需要使用相同的连接从 MySQL 获取该结果。
如果持久连接仍在使用中,则无法重复使用。发生这种情况的原因有很多,其中之一是未获取结果。 MySQL 将保持连接打开,等待客户端对结果集执行某些操作。从 MySQL 服务器获取完整结果后,它就可以接受新的查询。
这不仅是持久连接的问题,因为如果您在正常连接下一个接一个地使用 exec()
,未获取的结果集也可能是一个问题。
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
$pdo = new PDO("mysql:host=localhost;dbname=test;port=3307", "root", "", $options);
// The following will give:
// SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
var_dump($pdo->exec("SELECT 1"));
var_dump($pdo->exec("SELECT 1"));
PDOException: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in C:\wamp64\www\test\index.php on line 16
从标题中回答你的问题:是的。使用持久连接时使用 exec()
和 query()
之间存在差异,但在不使用持久连接时也存在这种差异。
tl;dr:不要使用 exec()
进行查询,这会产生结果。请改用准备好的语句。
关于php - 使用 PDO::ATTR_PERSISTENT = true 时,PDO::exec 和 PDO::query 之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59974191/
我觉得 for(int i = 0; i < 2; i++) 和 for(int i = 0; i < 2; ++i) 不应该做同样的事情。对于第二个例子,从循环开始 i 应该等于 1 对我来说更符合
我试图牢牢掌握异常情况,以便改进我的conditional loop implementation .为此,我进行了各种实验,扔东西,看看会被抓到什么。 这个让我惊喜不已: % cat X.hs mo
我只是想回答一个问题,但我遇到了一些我不明白的事情!为什么如果我在文件中使用内联 CSS 或 CSS,如本例中的颜色,结果就不一样! 代码相同,但第一段是绿色,第二段是红色! 我真的不明白为什么? 谢
我目前正在学习 CSS 并进行试验,我偶然发现了输出中的这种差异。所以这是代码: .red-text { color: red;
"""module a.py""" test = "I am test" _test = "I am _test" __test = "I am __test" ============= ~ $ p
在向 Firestore 写入文档时,我经常看到 serverTimestamp() 标记和 new Date() 对象之间的差异不为零。 差异范围从几 秒到几十 分钟。 他们不是在做同样的事情吗?
据我了解,2.675 和 numpy.float64(2.675) 都是相同的数字。然而,round(2.675, 2) 给出 2.67,而 round(np.float64(2.675), 2) 给
问题本身的描述很简单。我正在测试 C++11 中 std::thread 库和 boost::thread 库的区别。 这些的输出: #include #include #include int
我只是想将文本文件读入 pyspark RDD,我注意到 sqlContext.read.load 之间的巨大差异和 sqlContext.read.text . s3_single_file_inp
SC.exe 和 InstallUtil 都可以安装/卸载 Windows 服务。但它们的工作方式似乎并不相同。 有什么区别? 例如,InstallUtil 失败(找不到某些文件或依赖项错误),而 S
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我认为Thread对象就像是带有名称和静态Thread.CurrentThread()的抽象对象,就像访问Thread对象的方式一样。显然,这是错误的假设。。是这样的吗?
我是一名优秀的程序员,十分优秀!