我在一家公司工作,该公司最近更新了一个网站的PHP代码,从普通的MySQL到MySQLi,以便赶在弃用更改之前。
我们遇到了一些MySQL在网络级别使用64k源tcp端口并发生故障的问题。我们通过启用持久连接修复了这个问题。然而,我们现在有了一个新的问题,那就是我们运行的查询并不总是重用现有的连接,最终会填满所有的连接槽(200)。
我们运行的设置如下:
我们有多个DB服务器(在开发环境中有4个),具有复制表和单个数据库,每个客户端站点分布在服务器上(每个站点都有自己的模式),以提高性能。
我们有一个自定义的查询解析函数,它可以确定要连接到哪个主机,选择正确的模式并对其运行查询。这不是问题所在,这一切都运行得很好。
主DB服务器正在遭受连接的重创,填满然后拒绝任何新的连接。
每次页面加载所需的每台主机上只有一次mysqli_connect调用。但由于某些原因,这些连接似乎从未被重用过。即使多次刷新同一页面,也会为每次加载创建新的连接。
这是正常的吗?我原本期望重新加载相同的页面并获取相同的数据将重用刷新前创建的休眠连接。
发布于 2014-09-16 05:45:39
是的,这很正常。您应该阅读warnings on persistent connections。通常第一段就足以把你吓跑了。在其他语言中,持久连接的工作方式与预期不谋而合。
当您查看数据库服务器上的mysql进程时,是否看到大量空闲连接?您可能希望减小mysql wait timeout值以丢弃空闲连接。我通常在这个设置上相当激进(30秒),并且已经适当地扩展了系统(每天有100万的页面浏览量)。
要真正走在弃用更改的前面,您应该考虑使用PDO。不知羞耻的插件:我编写了管理连接、按需连接或按需重新连接的my own db class。这允许非常低的超时设置,而无需担心连接丢失。
https://stackoverflow.com/questions/25857209
复制相似问题