这个是杀了我 我们有一个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
连接string: 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。
这个问题只发生在单声道方面,但这是至关重要的,因为我们已经退休的Windows支持。
平均每小时发生10次左右,但间距变化很大。
这个问题见证了以下configuration:
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 – 它会发生。 之后,这是任何人的猜测。
由于在这里和其他地方的好build议,我跑了几个问题。
1)不pipemysql文档说什么,我似乎无法得到“localhost”来引用本地unix套接字文件 – 它总是去tcp。
2)另外我注意到每一个失败都伴随着“没有路由到主机”埋在堆栈跟踪。
3)使用像这样的连接string:“SERVER = / tmp / mysql.sock; DATABASE = xxx; UID = xxx; PWD = xxx;” 并设置我的服务器“skip-networking”我可以强制应用程序在本地套接字上运行。 我已经testing了足以满足问题不会发生在套接字上。
结论是什么?
我想有可能是多个不同的OSX和Ubuntu实例都有随机的,片状的networking问题,导致偶尔的“没有路由到主机”。 我很惊讶的连接器/ NET不是更有弹性,可能是一个单声道的事情,因为我们从来没有在Windows上看到它。
最终决议? 我把我的连接函数在for循环。 在失败之前,现在将尝试15次以获得连接。 经过几个小时的testing,我仍然看到这个问题,但从来没有超过11次尝试连接。
我不喜欢这个答案,但我得继续前进!