Да, безопасно обойти соединение. Вы обрабатываете соединение во внешнем управляющем блоке. В этом нет ничего небезопасного.
Что небезопасно, так это написание кода, который не гарантирует своевременное удаление соединения должным образом. Забыть очистить ресурс не имеет отношения к его передаче. Вы могли бы так же легко написать код, который оставляет зависшее соединение, никуда его не пропуская.
В C ++ вы защищены RAII, если вы размещаете в стеке или используете умные указатели. В C # сформулируйте жесткое правило, согласно которому все одноразовые объекты (например, соединения) должны быть объявлены в блоке «using». В Java очистите с помощью логики try-finally. Имейте обзоры кода на весь код уровня данных, чтобы гарантировать это.
Наиболее распространенный вариант использования - это когда у вас есть несколько операций, которые можно комбинировать во многих перестановках. И каждая из этих перестановок должна быть атомарной транзакцией (все успешно или откат). затем вы должны передать транзакцию (и, следовательно, соответствующее соединение) всем методам.
Предположим, у нас есть много действий foobar (), которые можно комбинировать различными способами как атомарные транзакции.
//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
conn.Open();
using (IDbTransaction tran = conn.BeginTransaction())
{
try
{//inner foobar actions just do their thing. They don't need to clean up.
foobar1(tran);
foobar2(tran);
foobar3(tran);
tran.Commit();
}
catch (Exception ex)
{ tran.Rollback(); }
}
}//connection is returned to the pool automatically
Кстати, вы захотите открыть соединения как можно позже, избавиться от них как можно скорее. Ваши товарищи по команде могут быть правы, если вы рассматриваете соединения как членов объекта, представляете их как ненужное состояние и оставляете соединения открытыми гораздо дольше, чем необходимо. Но акт передачи соединения или транзакции в качестве параметра по своей сути не является ошибочным.
КСТАТИ. В зависимости от того, поддерживает ли ваш язык функции первого класса, вы можете выполнить список действий foobar (). Таким образом, одна функция может обрабатывать все варианты действий. Устранение дублирования внешнего управляющего блока для каждой перестановки.