Sí, es seguro pasar una conexión. Maneja la conexión en un bloque de control externo. No hay nada inseguro al respecto.
Lo que no es seguro es escribir código que no garantice que la conexión se elimine de manera oportuna. Olvidar limpiar un recurso no está relacionado con pasarlo. Podrías escribir fácilmente un código que deja una conexión suspendida sin pasarlo a ningún lado.
En C ++, está protegido por RAII si asigna en la pila o utiliza punteros inteligentes. En C # establezca una regla estricta para que todos los objetos desechables (como las conexiones) se declaren en un bloque "en uso". En Java, limpie con la lógica try-finally. Tenga revisiones de código en todo el código de capa de datos para garantizar esto.
El caso de uso más común es cuando tiene varias operaciones que se pueden combinar en muchas permutaciones. Y cada una de estas permutaciones debe ser una transacción atómica (todas tienen éxito o retroceden). entonces debe pasar la transacción (y por lo tanto la conexión correspondiente) a todos los métodos.
Supongamos que tenemos muchas acciones foobar () que se pueden combinar de varias maneras como transacciones atómicas.
//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
Por cierto, querrá abrir las conexiones lo más tarde posible, deséchelas lo antes posible. Sus compañeros de equipo podrían tener razón si está tratando las conexiones como miembros del objeto, presentándolas como un estado innecesario y dejando las conexiones abiertas mucho más tiempo del necesario. Pero el acto de pasar una conexión o transacción como parámetro no es inherentemente incorrecto.
Por cierto. Dependiendo del soporte de su idioma para funciones de primera clase, puede realizar una lista de acciones foobar (). Entonces, una función podría manejar todas las permutaciones de las acciones. Eliminando la duplicación del bloque de control externo para cada permutación.