我为一家公司工作,该公司最近更新了从vanilla MySQL到MySQLi的站点的PHP代码,以便在弃用变更之前。
我们在网络级使用64k源TCP端口并且摔倒时遇到了一些问题。我们通过启用持久连接来修复它。 但是,我们现在遇到了一个新问题,即我们运行的查询并不总是重复使用现有连接,最终会填满所有连接槽(200)。
我们运行的设置是:
我们有多个数据库服务器(在开发环境中有4个),每个客户端站点都有复制表和单个数据库,这些客户端站点分布在服务器上(每个站点都有自己的架构)以提高性能。
我们有一个自定义查询解析函数,用于确定要连接的主机,选择正确的架构并运行查询。这不是问题,一切正常。
主数据库服务器受到连接的打击,填满然后拒绝任何新连接。
每个页面加载只需要每个主机调用一次mysqli_connect。但由于某种原因,连接似乎永远不会被重用。甚至刷新同一页面几次会为每个负载创建新的连接。
这是正常的吗?我本来希望重新加载相同的页面并获取相同的数据将重用刷新前创建的休眠连接..
答案 0 :(得分:0)
是的,这是正常的。你应该阅读warnings on persistent connections。第一段通常足以吓跑你。在其他语言中,持久连接按预期工作。
当您在数据库服务器上查看mysql进程时,您是否看到了大量空闲连接?您可能希望减少mysql wait timeout值以丢弃空闲连接。我通常在这个设置上相当积极(30秒)并且系统地扩展系统(每天1M页面浏览量)。
要真正领先于弃用变更,您应该考虑使用PDO。无耻的插件:我写了my own db class来管理连接,按需连接或根据需要重新连接。这允许非常低的超时设置,而不必担心连接断开。