2016-05-17 9 views
0

Ich habe ein gutes Stück auf diesem googled, aber nicht in der Lage, eine genaue Antwort zu finden. In unseren Protokollen werden folgende Fehler angezeigt:Wie zu überwachen Verbindungspooling für. NET MySQL Data Connector in IIS

Timeout abgelaufen. Die Zeitüberschreitung ist abgelaufen, bevor eine Verbindung vom Pool erhalten wurde. Dies ist möglicherweise der Fall, weil alle gepoolten Verbindungen verwendet wurden und die maximale Poolgröße erreicht wurde. Stack-Trace: bei MySql.Data.MySqlClient.MySqlPool.GetConnection() bei MySql.Data.MySqlClient.MySqlConnection.Open()

I-Client-Verbindungen auf dem MySQL-Server überwachen (und sie scheinen in Ordnung) , aber der Fehler tritt in der ASP-Anwendung auf. Da ist nichts offensichtlich in meinem Code, also wollte ich den Verbindungspool überwachen und sehen, was vor sich ging. Ich möchte MySQL Leistungsindikatoren in Windows-Performance-Monitor hinzufügen. Aber die einzigen MySQL-Zähler, die ich sehe, sind HardProcedureQueries und SoftProcedureQueries. SQL Server und Oracle haben eine Last, die sich auf das Verbindungs-Pooling und andere interessante Elemente bezieht. Es gab einige unbeantwortete Artikel in verschiedenen Foren, die dasselbe forderten.

Also, wie überwachen die Leute da draußen ASP.NET MySQL Connection Pool Zähler in IIS auf Windows?

Wir verwenden .NET 4 auf IIS 7.5 unter Windows Server 2008

Antwort

1

ich zwei Dinge getan haben, um mit diesem Problem zu helfen.

Der vollständige Code, den ich verwenden ist:

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

welche MySQL-Treiber-Version haben Sie? Ich benutze 6.9.9.0 und ich verstehe die Zahlen nicht, die ich sehe. 'verfügbar' ist gleich 'maximumpoolsize'. inUsePool und idlePool 0 die meiste Zeit; Irgendwann ist eine dieser Nummern 1, aber ich erinnere mich nicht daran. Ich würde erwarten, dass mein inUsePool mindestens zweistellig ist. Ich verwende Windows 2008 R2, IIS 7.5, .und NET 4.5. – phi

+0

Ich benutze auch 6.9.9. Am Ende war die Überwachung des Verbindungspools für diese spezielle Anwendung nicht besonders hilfreich. Wir bekommen die Fehler nicht mehr - die Lösung bestand darin, unseren gesamten Legacy-Code zu durchlaufen und sicherzustellen, dass die Verbindungen ordnungsgemäß gehandhabt werden. –