Соединение не было закрыто, текущее состояние соединения открыто
Я пишу приложение ASP.NET. В моем datalayer соединение sql открывается и закрывается до и после запроса. SqlConnection хранится как частное поле одного класса. Каждый вызов базы данных в классе использует ту же структуру:
conn.Open();
try
{
// database querying here
}
finally
{
conn.Close();
}
Тем не менее, в очень редких случаях я получаю исключение. Связь не была закрыта. Текущее состояние соединения открыто. Невозможно воспроизвести проблему, поскольку она возникает очень редко из разных частей кода. В моем приложении есть несколько потоков, но новые потоки также создают новые классы слоев данных и, следовательно, новые объекты подключения.
Я не понимаю, как можно подключить соединение, открытое с помощью приведенного выше кода. Не следует ли закрывать соединение после открытия, исключая возможность исключения из вышеперечисленного?
Ответы
Ответ 1
Вероятно, в блок try
, который вы не обрабатываете, генерируется исключение. См. Это примечание в MSDN для try-finally:
В обработанном исключении гарантируется, что соответствующий блок finally будет запущен. Однако, если исключение необработанно, выполнение блока finally зависит от того, как запускается операция исключения размотки.
Я бы рекомендовал обернуть соединение в блоке using
в любом случае:
using (SqlConnection connection = new SqlConnection(connectionString))
{
//etc...
}
В качестве альтернативы добавьте блок catch в try-finally
:
conn.Open();
try
{
}
catch
{
}
finally
{
conn.Close();
}
Ответ 2
вы должны закрыть соединения, как только закончите работу. Попробуйте открыть соединения в кратчайшие сроки.
Однако лучше использовать с помощью, он вызовет метод Dispose даже в случае исключений.
using (SqlConnection conn= new SqlConnection(conStr))
{
//etc...
}
ИЛИ
1) Откройте соединение
2) Доступ к базе данных
3) Закройте соединение
//conn.Open();
try
{
conn.Open();
//Your Code
}
finally
{
conn.Close();
conn.Dispose();//Do not call this if you want to reuse the connection
}