В большинстве случаев проблемы организации пула подключений связаны с "утечками соединения". Ваше приложение, вероятно, не закрывает свои соединения с базой данных правильно и последовательно. Когда Вы оставляете соединения открытыми, они остаются заблокированными, пока сборщик "мусора".NET не закрывает их для Вас путем вызова их Finalize()
метод.
Вы хотите удостовериться, что Вы действительно закрытие соединения . Например, следующий код вызовет утечку соединения, если код между .Open
и Close
выдаст исключение:
var connection = new SqlConnection(connectionString);
connection.Open();
// some code
connection.Close();
корректный путь был бы этим:
var connection = new SqlConnection(ConnectionString);
try
{
connection.Open();
someCall (connection);
}
finally
{
connection.Close();
}
или
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
someCall(connection);
}
, Когда Ваша функция возвраты соединение от метода класса удостоверяются, что Вы кэшируете ее локально и называете Close
метод. Вы пропустите соединение с помощью этого кода, например:
var command = new OleDbCommand(someUpdateQuery, getConnection());
result = command.ExecuteNonQuery();
connection().Close();
соединение, возвращенное от первого вызова до getConnection()
, не закрывается. Вместо того, чтобы закрыть Ваше соединение, эта строка создает новое и попытки закрыть его.
, Если Вы используете SqlDataReader
или OleDbDataReader
, закройте их. Даже при том, что закрытие самого соединения, кажется, добивается цели, вставляет дополнительное усилие закрыть Ваши объекты средства чтения данных явно при использовании их.
Эта статья" , Почему Соединение Объединяет Переполнение? " из Журнала MSDN/SQL объясняет много деталей и предлагает некоторые стратегии отладки:
sp_who
или sp_who2
. Эти системные хранимые процедуры возвращают информацию из sysprocesses
системная таблица, которая показывает состояние и информацию обо всех рабочих процессах. Обычно Вы будете видеть один идентификатор серверного процесса (SPID) для каждого подключения. При именовании соединения при помощи аргумента Имени приложения в строке подключения рабочие соединения будет легко найти. TSQL_Replay
для трассировки открытых соединений. Если Вы знакомы с Профилировщиком, этот метод легче, чем опрос при помощи sp_who. (And yes I did look at the code of the library method, and can get some idea of what exceptions are raised but I cannot be 100% sure and if it is not documented I feel uncomfortable relying on it.)
I suggest having a look at the tests, as they will show some of the "likely" scenarios and what might be raised. Don't forget that good tests are documentation, too.
Никогда нельзя быть уверенным в том, какие исключения могут быть вызваны, если только код библиотеки не улавливает все, а затем обертывает их. Лучше всего принять хороший ввод из вашего кода, очистив то, что входит, а затем использовать собственную обработку исключений более высокого уровня, чтобы поймать неверный ввод из ваших входов.
Я полагаю, что если документация не предоставлена, вам придется полагаться на что-то вроде этого:
begin
# code goes here
rescue
# fail reason is in $!
end