从我们的 Web 应用程序打开到 SQL Server 2005 的连接时,我们偶尔会看到以下错误:
无法在此批处理中调用“模拟会话安全上下文”,因为同时批处理已调用它。
我们使用 MARS 和连接池。
异常源自以下代码:
protected SqlConnection Open()
{
SqlConnection connection = new SqlConnection();
connection.ConnectionString = m_ConnectionString;
if (connection != null)
{
try
{
connection.Open();
if (m_ExecuteAsUserName != null)
{
string sql = Format("EXECUTE AS LOGIN = {0};", m_ExecuteAsUserName);
ExecuteCommand(connection, sql);
}
}
catch (Exception exception)
{
connection.Close();
connection = null;
}
}
return connection;
}
我发现了一篇MS Connect 文章,该文章表明该错误是由于在发送 EXECUTE AS LOGIN 命令之前之前的命令尚未终止而引起的。然而,如果连接刚刚打开,这怎么可能呢?
这可能与连接池与 MARS 的奇怪交互有关吗?
更新:在短期内,我们通过在发生这种情况时清除连接池来实现一种解决方法,以摆脱不良连接,否则它会不断交还给各种用户。(现在这种情况每天发生 5-10 次,只有少数同时用户,所以这很烦人。)但是如果有人有任何进一步的想法,我们仍在寻找真正的解决方案......