Так, безпечно пройти навколо зв'язку. Ви обробляєте з'єднання у зовнішньому блоці управління. У цьому немає нічого небезпечного.
Небезпечно - це написання коду, який не гарантує належне розміщення з'єднання. Забуття очистити ресурс не пов'язане з передачею його навколо. Ви можете так само легко написати код, який залишає звисне з'єднання, не передаючи його нікуди.
У C ++ ви захищені RAII, якщо ви виділяєте в стеку або використовуєте смарт-покажчики. У C # складіть жорстке правило, що всі одноразові об'єкти (наприклад, з'єднання) оголошуються в блоці "використовуючи". У Java прибирайте за допомогою логіки спробу. Проведіть огляд коду на весь код рівня даних, щоб забезпечити це.
Найбільш поширений випадок використання, коли у вас є кілька операцій, які можна комбінувати в багатьох перестановках. І кожна з цих перестановок повинна бути атомною транзакцією (всі успішні або відкатні). тоді вам слід передати транзакцію (а отже, і відповідне з'єднання) навколо всіх методів.
Припустимо, у нас є багато дій 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 (). Таким чином, одна функція могла обробляти всі перестановки дій. Усунення дублювання зовнішнього керуючого блоку для кожної перестановки.