Listing 1
public static object GetConnectionPool(SqlConnection connection)
{
FieldInfo internalConnectionFieldInfo =
typeof(SqlConnection).GetField("_internalConnection",
BindingFlags.NonPublic | BindingFlags.Instance);
if (internalConnectionFieldInfo != null)
{
object sqlInternalConnection = internalConnectionFieldInfo.GetValue(connection);
if (sqlInternalConnection != null)
{
PropertyInfo poolPropertyInfo =
sqlInternalConnection.GetType().GetProperty("Pool");
return poolPropertyInfo.GetValue(sqlInternalConnection, new object[] {});
}
}
return null;
}
Listing 2
public static int GetConnectionCleanupTimeout(SqlConnection connection)
{
PropertyInfo cleanupTimeoutPropertyInfo = null;
Object control = null;
object pool = GetConnectionPool(connection);
if (pool != null)
{
PropertyInfo controlPropertyInfo = pool.GetType().GetProperty("Control");
control = controlPropertyInfo.GetValue(pool, new object[] {});
if (control != null)
{
cleanupTimeoutPropertyInfo = control.GetType().GetProperty("CleanupTimeout");
if (cleanupTimeoutPropertyInfo != null)
return (int) cleanupTimeoutPropertyInfo.GetValue(control, new object[] {});
}
}
return -1;
}
Listing 3
public static void SetConnectionCleanupTimeout(SqlConnection connection, int
cleanupTimeout)
{
object pool = GetConnectionPool(connection);
if (pool != null)
{
FieldInfo cleanupTimerFieldInfo = pool.GetType().GetField("_cleanupTimer",
BindingFlags.NonPublic | BindingFlags.Instance);
if (cleanupTimerFieldInfo != null)
((Timer) cleanupTimerFieldInfo.GetValue(pool)).Change(cleanupTimeout,
cleanupTimeout);
}
}
Listing 4
string connectionString = "Server=(local);Integrated Security=SSPI;Database=Northwind";
SqlConnection connection1 = new SqlConnection(connectionString);
SqlConnection connection2 = new SqlConnection(connectionString);
SqlConnection connection3 = new SqlConnection(connectionString);
connection1.Open();
connection2.Open();
connection3.Open();
pool = SqlClientEx.GetConnectionPool(connection1);
connection3.Close();
connection2.Close();
connection1.Close();
Listing 5
public static void ReleaseObjectPool(object pool)
{
if (pool != null)
{
MethodInfo cleanupCallbackMethodInfo = pool.GetType().GetMethod("CleanupCallback",
BindingFlags.NonPublic | BindingFlags.Instance);
if (cleanupCallbackMethodInfo != null)
{
cleanupCallbackMethodInfo.Invoke(pool, new object[] {null});
cleanupCallbackMethodInfo.Invoke(pool, new object[] {null});
}
}
}