Как иметь дело с не знанием, какие исключения могут быть повышены методом библиотеки в Ruby?

В большинстве случаев проблемы организации пула подключений связаны с "утечками соединения". Ваше приложение, вероятно, не закрывает свои соединения с базой данных правильно и последовательно. Когда Вы оставляете соединения открытыми, они остаются заблокированными, пока сборщик "мусора".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) для каждого подключения. При именовании соединения при помощи аргумента Имени приложения в строке подключения рабочие соединения будет легко найти.
  • SQL Server Profiler Использования с шаблоном SQLProfiler TSQL_Replay для трассировки открытых соединений. Если Вы знакомы с Профилировщиком, этот метод легче, чем опрос при помощи sp_who.
  • Использование Монитор производительности для контроля пулов и соединений. Я обсуждаю этот метод через мгновение.
  • счетчики производительности Монитора в коде. Можно контролировать здоровье объединения соединения и количество установленных соединений при помощи стандартных программ для извлечения счетчиков или при помощи новой.NET средства управления PerformanceCounter.

20
задан Mogsdad 17 January 2018 в 03:42
поделиться

3 ответа

(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.

9
ответ дан 30 November 2019 в 01:13
поделиться

Никогда нельзя быть уверенным в том, какие исключения могут быть вызваны, если только код библиотеки не улавливает все, а затем обертывает их. Лучше всего принять хороший ввод из вашего кода, очистив то, что входит, а затем использовать собственную обработку исключений более высокого уровня, чтобы поймать неверный ввод из ваших входов.

2
ответ дан 30 November 2019 в 01:13
поделиться

Я полагаю, что если документация не предоставлена, вам придется полагаться на что-то вроде этого:

begin
   # code goes here
rescue
   # fail reason is in $!
end
4
ответ дан 30 November 2019 в 01:13
поделиться
Другие вопросы по тегам:

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