Tak, można bezpiecznie ominąć połączenie. Obsługujesz połączenie w zewnętrznym bloku sterującym. Nie ma w tym nic niebezpiecznego.
Niebezpieczne jest pisanie kodu, który nie gwarantuje, że połączenie zostanie odpowiednio usunięte w odpowiednim czasie. Zapominanie o oczyszczeniu zasobu nie ma związku z przekazywaniem go. Równie łatwo możesz napisać kod, który pozostawia zawieszone połączenie, nie przekazując go nigdzie.
W C ++ jesteś chroniony przez RAII, jeśli alokujesz na stosie lub używasz inteligentnych wskaźników. W języku C # ustal twardą zasadę, że wszystkie obiekty jednorazowego użytku (takie jak połączenia) powinny być zadeklarowane w bloku „używającym”. W Javie posprzątaj z logiką try-wreszcie. Dokonaj recenzji kodu dla wszystkich kodów warstwy danych, aby to zapewnić.
Najczęstszym przypadkiem użycia jest kilka operacji, które można łączyć w wiele kombinacji. I każda z tych permutacji musi być transakcją atomową (wszystkie zakończone powodzeniem lub wycofaniem). następnie musisz przekazać transakcję (a zatem odpowiednie połączenie) do wszystkich metod.
Załóżmy, że mamy wiele akcji foobar (), które można łączyć na różne sposoby jako transakcje atomowe.
//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
BTW, będziesz chciał otwierać połączenia tak późno, jak to możliwe, usuń je jak najszybciej. Twoi koledzy z drużyny mogą mieć rację, jeśli traktujesz połączenia jako elementy obiektu, wprowadzając je jako niepotrzebny stan i pozostawiając połączenia otwarte dłużej niż to konieczne. Ale przekazanie połączenia lub transakcji jako parametru nie jest z natury złe.
BTW. W zależności od wsparcia języka dla funkcji pierwszej klasy, możesz podjąć listę działań foobar (). Tak więc jedna funkcja może obsłużyć wszystkie kombinacje akcji. Eliminowanie duplikacji zewnętrznego bloku kontrolnego dla każdej permutacji.