【发布时间】:2012-02-20 23:26:54
【问题描述】:
这个要杀了我。我们在 MySQL 数据库上有一个 ASP.NET/Mono 应用程序。几个月来,我们一直被完全随机但始终如一的“无法连接到任何指定的 MySQL 主机”所困扰。我绝不是 MySQL 专家,我希望这是愚蠢的。
规格:
MySQL 5.5.17
MySQL 连接器/网络 6.4.4
单声道 2.10.8
MonoDevelop 2.8.6.5
连接字符串:SERVER=localhost,3306;DATABASE=xxx;UID=xxx;PWD=xxx;CONNECTION TIMEOUT=90;Encrypt=false;
Max_connections 设置为 150。连接数永远不会超过 5 个,并且它们都处于活动状态(可能是由于池化)。
应用程序是 C# ASP.NET 3.5。在 Windows/IIS 上运行稳定多年。九个月前,我们的市场让我们放弃了 Windows,所以我们(我很容易补充)将整个事情转移到 Mono/Apache。
该问题仅出现在 Mono 端,但这很关键,因为我们已经停止了对 Windows 的支持。
平均每小时发生约 10 次,但间隔变化很大。
在以下配置中出现了该问题:
Ubuntu 11/Apache2/mod_mono
OSX Lion/Apacke2/mod_mono
Ubuntu 11/xsp2/MonoDevelop 调试服务器
OSX Lion/xsp2/MonoDevelop 调试服务器
搞砸了keepalive、wait_timeout、connectionreset等都无济于事。时间似乎没有效果。 conn.open 上的错误是瞬时的 - 不是在任何连接超时之后。
这是一条线索 - 应用程序绝对不会在 Pooling=false 的情况下运行。几乎每次连接尝试都会失败。我当然想要池化,但我不确定为什么没有它就行不通。
应用程序有一个内置的“心跳”(数据库中的用户会话) - 每 2 分钟一次。
最令人抓狂的?它绝对不能在运行环境中按需复制——它是随机的。我检查了查询大小、执行时间等。
在一种情况下我可以做到这一点:在 Ubuntu 服务器或 OSX 的初始启动时,Mono 第一次连接到 MySQL - 它会在那时发生。在那之后,这是任何人的猜测。
【问题讨论】:
-
max_connections 限制怎么样?您可能会在不同的时间达到允许的最大值。
-
似乎不太可能,因为它发生在第一次连接上
-
+1 提出了一个很好的问题,但我认为在 serverfault.com 上会更好
-
这对我来说似乎不是随机的。我想每当连接池需要打开一个新连接时就会发生这种情况。您的连接超时时间为 90 秒,因此,如果您启动新服务器并限制访问权限以便只有您可以访问服务器,那么(如果我是对的)您应该在每次允许连接时看到错误( s) 在连接池超时(即 90+ 秒不活动)。
-
好点 - 我相应地更新了问题。约翰,连接超时不是客户端在请求连接时等待响应的时间吗?改变它没有效果。此外,池正在维护“真实”连接,而不是我的代码。我几乎确信是游泳池给了我这个错误。
标签: mysql macos mono asp.net-3.5 connector-net