2016-05-17 47 views
0

我已经在这里搜索了一点点,但未能找到确切的答案。我们在我们的日志中看到以下错误:如何在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

回答

1

我已经做了两件事情来帮助解决这个问题上使用的是.NET 4的IIS 7.5。

完整的代码我用的是:

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); 
+0

你用什么MySQL驱动程序版本?我使用的是6.9.9.0,我不明白我所看到的数字。 'available'等于'maximumpoolsize'。 inUsePool和idlePool 0大部分时间;有时候其中一个数字是1,但我不记得是哪一个。我期望我的inUsePool至少是两位数。我正在使用Window 2008 R2,IIS 7.5,和.NET 4.5。 – phi

+0

我正在使用6.9.9。最后,对于这个特定的应用程序来说,连接池监视最终并没有特别有用。我们不会再犯这些错误了 - 解决方法是通过我们所有的遗留代码,并确保连接得到正确处理。 –