我没有运气这个问题 https://stackoverflow.com/questions/553331/detecting-unusable-pooled-sqlconnections所以我制作了这个尽可能简单的测试用例来演示这个问题。
在下面的代码中,是否可以在尝试使用连接之前检测到连接不可用?
SqlConnection c = new SqlConnection(myConnString);
c.Open(); // creates pool
setAppRole(c); // OK
c.Close(); // returns connection to pool
c = new SqlConnection(myConnString); // gets connection from pool
c.Open(); // ok... but wait for it...
// ??? How to detect KABOOM before it happens?
setAppRole(c); // KABOOM
KABOOM 在 Windows 事件日志中表现为错误;
连接已被删除,因为打开它的主体随后采用了新的安全上下文,然后尝试在其模拟的安全上下文下重置连接。不支持这种情况。请参阅联机丛书中的“模拟概述”。
...加上代码中的异常。
setAppRole 是在连接上设置应用程序角色的简单方法。与此类似...
static void setAppRole(SqlConnection conn) {
using (IDbCommand cmd = conn.CreateCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = "exec sp_setapprole ";
cmd.CommandText += string.Format("@rolename='{0}'",myUser);
cmd.CommandText += string.Format(",@password='{0}'",myPassword);
cmd.ExecuteNonQuery();
}
}
在真实的代码中尝试使用sp_unsetapprole在关闭连接之前,但不能总是保证(继承了有缺陷的多线程应用程序)。无论如何,期望能够在引起爆炸之前检测到爆炸似乎仍然是合理的。