2010-01-07 10 views
5

Hace un tiempo escribí una capa ORM para mi aplicación .NET, donde todas las filas de bases de datos están representados por una subclase de DatabaseRecord. Hay una serie de métodos como Load(), Save() etc. En mi implementación inicial creé una conexión con la base de datos en el constructor de DatabaseRecord, p.sobrecarga de crear nuevo SqlConnection en C#

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString 
); 

entonces yo llamo Open() y Close() en ese SqlConnection al principio y al final de mis métodos que acceden a la base de datos. Esto me pareció (como alguien que estaba familiarizado con la programación pero nuevo en C# y .net) la forma más eficiente de hacer las cosas: tener una conexión y abrirla/cerrarla cuando sea necesario dentro de la clase.

yo sólo he estado haciendo un poco de lectura y aunque parece que este patrón se recomienda en varios lugares:

using (var connection = new SqlConnection(...)) { 
    connection.Open(); 
    // Stuff with the connection 
    connection.Close(); 
} 

puedo ver por qué es deseable - la conexión se realiza de forma automática Dispose() d incluso si el cosas que haces en el medio causa una excepción no detectada. Me preguntaba cuál es la sobrecarga para llamar al new SqlConnection() potencialmente muchas veces como esta.

agrupación de conexiones está en así que me imagino la sobrecarga es mínima y el segundo enfoque debería ser la mejor práctica, pero sólo quería asegurarse de que mis suposiciones son correctas.

+0

Gracias por todo el respuestas asombrosamente rápidas! – vitch

Respuesta

8

Sí, es la mejor práctica. El using hace su llamada a Close() exception-safe.

Y la sobrecarga de crear una (cualquiera) es objeto de hecho mínima, y ​​el más pequeño de los objetos de corta duración (que se quedan en la generación de GC 0).

Tenga en cuenta que usted no tiene que llamar a Close() al final del uso de bloques más, se hace automáticamente para usted (Desechar == Cerrar).

+0

¿Qué tan mínimo? ¿Hay algún punto de referencia en cualquier lugar que muestre cuánto se pierde el rendimiento al abrir y cerrar conexiones? ¿Hay un apretón de manos en la red que se activa cuando se llama al método Open? –

+0

En realidad, creo que este artículo responde perfectamente mi pregunta. https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling –

+0

Si este artículo es correcto, la agrupación de conexiones debe manejar explícitamente el protocolo de enlace, etc.y asegúrese de que no haya ningún apretón de manos innecesario. –

1

Esto es parcialmente una cuestión de gusto. Siempre que emplee la agrupación de conexiones, la sobrecarga de crear una nueva (reciclaje de una conexión agrupada) será mínima, por lo que generalmente el patrón recomendado es crear nuevos objetos de conexión según sea necesario.

Si ejecuta varios comandos inmediatamente después de uno al otro entonces no veo ninguna razón para crear nuevas conexiones para cada uno de ellos, pero se debe evitar aferrarse a abrir conexiones desde hace mucho tiempo.

Además, debe tener en cuenta que el método Dispose cerrará la conexión para usted. Por lo tanto, no es necesario llamar tanto al Close como al Dispose. Como la cláusula using llamará a disposición cuando finalice, normalmente no es necesario llamar al Close.

1

Si no está seguro sobre el costo de apertura/cierre de la conexión, tienen una variable SqlConnection miembro de su clase, pero hacer que la clase IDisposable y disponer de los SqlConnection cuando la clase está dispuesto

+0

En realidad, al pensarlo más, creo que este podría ser el enfoque más eficiente. He desarrollado tu sugerencia un poco en otra pregunta: sería genial si pudieras decirme si entendí bien: http://stackoverflow.com/questions/2020576/creating-an-disposable-class-in -c-which-cleans-up-an-sqlconnection-when-finishe – vitch