如何在IIS中监视.NET的连接池MySQL数据连接器
问题描述:
我已经在这里搜索了一点点,但未能找到确切的答案。我们在我们的日志中看到以下错误:如何在IIS中监视.NET的连接池MySQL数据连接器
Timeout expired。在从池中获取 连接之前已经超时。可能发生了这种情况,因为所有连接池都正在使用中,并且已达到最大池大小。堆栈跟踪:在 MySql.Data.MySqlClient.MySqlPool.GetConnection()在 MySql.Data.MySqlClient.MySqlConnection.Open()
我可以监控MySQL服务器上的客户端连接(他们似乎罚款) ,但错误发生在ASP应用程序中。我的代码中没有什么明显的,所以我想监视连接池并查看发生了什么。 我想在Windows中将性能计数器添加到性能监视器中。但是我看到的唯一的MySQL计数器是HardProcedureQueries和SoftProcedureQueries。 SQL Server和Oracle具有与连接池和其他感兴趣的项目相关的负载。 在不同的论坛中有一些未答复的文章提出相同的问题。
那么,那里的人们如何监视Windows上IIS中的ASP .NET MySQl连接池计数器?
我们在Windows Server 2008
答
我已经做了两件事情来帮助解决这个问题上使用的是.NET 4的IIS 7.5。
- 升级MySQL驱动程序。
- 从How to query the current size of the MySQL's .Net connector's connection pool?使用的代码创建一个网页来监视我的服务器上连接池的状态。
完整的代码我用的是:
string path = u.MapPath("~/bin/MySql.Data.dll");
Assembly ms = Assembly.LoadFrom(path);
Type type = ms.GetType("MySql.Data.MySqlClient.MySqlPoolManager");
MethodInfo mi = type.GetMethod("GetPool", BindingFlags.Static | BindingFlags.Public);
var pool = mi.Invoke(null, new object[] { new MySqlConnectionStringBuilder(ConnectionString) });
Type mip = ms.GetType("MySql.Data.MySqlClient.MySqlPool");
MemberInfo[] mei1 = mip.GetMember("inUsePool", BindingFlags.NonPublic);
totalAvailable = (int)pool.GetType().InvokeMember("available", BindingFlags.GetField | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance, null, pool, new object[] { });
var o = pool.GetType().InvokeMember("inUsePool", BindingFlags.GetField | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, pool, new object[] { });
var o1 = pool.GetType().InvokeMember("idlePool", BindingFlags.GetField | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance, null, pool, new object[] { });
inUseCount = (int)o.GetType().InvokeMember("Count", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public, null, o, null);
idleCount = (int)o1.GetType().InvokeMember("Count", BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public, null, o1, null);
你用什么MySQL驱动程序版本?我使用的是6.9.9.0,我不明白我所看到的数字。 'available'等于'maximumpoolsize'。 inUsePool和idlePool 0大部分时间;有时候其中一个数字是1,但我不记得是哪一个。我期望我的inUsePool至少是两位数。我正在使用Window 2008 R2,IIS 7.5,和.NET 4.5。 – phi
我正在使用6.9.9。最后,对于这个特定的应用程序来说,连接池监视最终并没有特别有用。我们不会再犯这些错误了 - 解决方法是通过我们所有的遗留代码,并确保连接得到正确处理。 –