MySql *完全随机*无法连接

MySql *完全随机*无法连接

这真是让我头疼。我们在 MySQL 数据库上有一个 ASP.NET/Mono 应用程序。

几个月来,我们一直被“无法连接到任何指定的 MySQL 主机”这个完全随机但持续发生的错误所困扰。我绝不是 MySQL 专家,我希望这只是一件愚蠢的事情。

具体内容:

MySQL 5.5.17
MySQL Connector/Net 6.4.4
Mono 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 debug server
OSX Lion/xsp2/MonoDevelop debug server

尝试过 keepalive、wait_timeout、connectionreset 等,但无济于事。计时似乎没有效果。错误在 conn.open 上立即发生 - 而不是在任何连接超时之后。

这里有一条线索 - 应用程序绝对不会在 的情况下运行Pooling=false。几乎每次连接尝试都会失败。当然,我希望启用池化,但我不确定为什么没有它就无法运行。

该应用程序具有内置的“心跳”(数据库中的用户会话) - 每 2 分钟一次。

最让人抓狂的是什么?它绝对无法在运行环境中按需重现 - 它是随机的。我检查了查询大小、执行时间等。

只有在一种情况下我才能实现这一点:在首次启动 Ubuntu 服务器或 OSX 时,Mono 第一次与 MySQL 建立连接时,它就会发生。之后,就只能猜测了。

答案1

感谢这里和其他地方的良好建议,我解决了几个问题。

1) 无论 mysql 文档怎么说,我似乎都无法让“localhost”引用本地 unix 套接字文件 - 它总是转到 tcp。2
) 我还注意到,每次失败都伴随着“无路由到主机”隐藏在堆栈跟踪中。3
) 使用这样的 conn 字符串:“SERVER=/tmp/mysql.sock;DATABASE=xxx;UID=xxx;PWD=xxx;”并将我的服务器设置为“skip-networking”,我能够强制应用程序在本地套接字上运行。我已经进行了足够多的测试,确信问题不会发生在套接字上。

结论?

我猜想可能是多个不同的 OSX 和 Ubuntu 实例都存在随机、不稳定的网络问题,导致偶尔出现“无路由到主机”的情况。我很惊讶 Connector/NET 的弹性不够强,可能是 Mono 的问题,因为我们从未在 Windows 上看到过这种情况。

最终解决方案?我将连接函数放入 for 循环中。现在它会尝试 15 次才能连接成功。经过几个小时的测试,我仍然看到这个问题,但连接尝试次数从未超过 11 次。

我不喜欢这个答案,但我必须继续前进!

相关内容