При открытии соединения с SQL Server 2005 с нашего веб-приложения, иногда мы видим эту ошибку:SQL Exception: «Контекст Impersonate Security Session» нельзя назвать в этой партии, так как одновременная партия назвал его
«IMPERSONATE Контекст безопасности сеанса "не может быть вызван в этой партии, потому что это вызвало одновременную партию.
Мы используем 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 article, который предполагает, что ошибка возникает, когда предыдущая команда еще не прекращен до того, как команда EXECUTE AS ВХОД посылается. Но как это может быть, если соединение только что было открыто?
Может ли это быть чем-то связанным с пулом соединений, взаимодействующих странно с MARS?
ОБНОВЛЕНИЕ: В краткосрочной перспективе мы применили обходной путь, очистив пул соединений, когда это происходит, чтобы избавиться от плохого соединения, поскольку в противном случае он все время обращается к различным пользователям. (Это сейчас происходит 5-10 раз в день с небольшим количеством одновременных пользователей, поэтому это довольно раздражает.) Но если у кого-то есть какие-то дальнейшие идеи, мы по-прежнему смотрим на реальное решение ...
Благодарим за отзыв. Я согласен с тем, что он должен иметь какое-то отношение к MARS, но, разумеется, множество наборов результатов основаны на каждом соединении? И моя связь не имеет никаких предыдущих наборов результатов, поскольку я только что открыл ее, и она «новая» (хотя и из пула). Я думаю, что в вашей второй цитате, где говорится, что «объем олицетворения является серверным», это означает только для текущего соединения. – kasey
@ kasey: Я предполагаю, что одно соединение имеет много сеансов, а EXECUTE AS - за сеанс. Когда соединение повторно используется из пула, я предполагаю, что переключатель контекста все еще установлен. ччмм. Возможно, это просто пул соединений и EXECUTE AS ... Интересный вопрос у вас здесь :-) – gbn