【发布时间】:2011-09-13 15:20:52
【问题描述】:
我的网站有问题,在不同部分使用两种类型的连接连接到 MySQL 数据库:一些 PDO,一些 mysql_connect()。
网站的第一部分是使用非常经典的 'mysql_query()' PHP 函数请求 MySQL。这部分对地理数据进行了一些繁重的查询。其中一些请求(已经优化)需要很长时间。
该网站的另一部分是较新的,并且是通过 PDO 连接使用 Doctrine 制作的。
问题是,当一个大进程在一个浏览器页面中运行时(可能需要大约 1 分钟来处理并返回页面),如果用户打开另一个页面,PDO 连接处于睡眠模式,并保持从加载整个页面。 60 秒后(mysql 的 wait_timeout)连接被终止,PDO 得到一个异常“The MySQL Server has gone away”。
奇怪的是,只有经典的 mysql_connect() 和 mysql_query() 的其他页面可以并行运行而没有问题,只有 PDO 查询被阻止并最终死亡。
任何意见将不胜感激。
【问题讨论】:
-
MySQL 有每个连接超时。由于 PDO 和 mysql_*() 是两个不同的环境,很可能它们配置了不同的超时时间。
-
我猜可能是 Table Lock 造成的。
-
我只对这些请求进行读取(仅 SELECT),而 PDO 完全在另一个数据库上工作。此外,超时不是问题,问题是 PDO 根本无法与其他查询并行运行。
-
可能有多种原因。如果您可以记录查询会更好。另外,在 PDO 尝试运行查询时尝试在 mysql 中“显示进程列表”。另外,您可以尝试直接从 mysql 客户端运行 PDO 查询吗?它会告诉你查询是否真的需要很长时间。
-
@Cadrach - 您是否使用套接字进行两个连接?还是通过 http 端口?