Задать вопрос
@lomaster
.NET и веб-разработчик

Потокобезопасен ли ADO.NET?

Потокобезопасен ли ADO.NET?

Простой запрос вида:
Dim Connection As SqlClient.SqlConnection = New SqlClient.SqlConnection(ConnectionSettings.Connect­ionString)
Dim Command As System.Data.SqlClient.SqlCommand
Connection.Open()
Command = RequestBuilder.GetSomeData() 'тут заполняется commandtext и параметры запроса
Command.CommandTimeout = FCommandTimeout
Command.Connection = Connection
DataSetAdapter = New SqlClient.SqlDataAdapter(Command)
DS = New System.Data.DataSet("GetSomeData")
Try
  DataSetAdapter.Fill(DS)
Finally
  If Connection IsNot Nothing AndAlso Connection.State = ConnectionState.Open Then 
    Connection.Close()
  End If
End Try


Возвращает совершенно «левые» данные, возможно из запроса, который выполняется в параллельном потоке (дефект проявляется только при многопоточной работе). Как бороться и почему оно так?
  • Вопрос задан
  • 3268 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
@Seter17
здесь внизу написано что ado.net не потокобезопасный, кроме чтения из датасета. Так что наврено вам надо подумать над разграничениями
Ответ написан
Комментировать
@mayorovp
Поскольку вы создаете каждый раз новый Connection, то с потокобезопасностью все в порядке.
Ищите ошибку в RequestBuilder.GetSomeData()
Ответ написан
Комментировать
А Вы в SQL запросе используете временные таблицы (#table)?

Дело в том, что временные таблицы живут в пределах одного соединения, а SQL Server после закрытия подключения не убивает его сразу, а держит еще некоторое время (это сделано для увеличения производительности). Таким образом при частых запросах SQL Server может отдать такое соединение со всеми временными таблицами…

Выход из этой ситуации — в SQL запросе удалять все из временных таблиц если они существуют.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы