none
Cerrar conexiones activas SQL SERVER RRS feed

  • Pregunta

  • Hola, quisiera preguntar una cosilla..

    Estoy haciendo un programa en Visual Studio que trabaja con una base de datos Sql Server. 

    Para hacer el boton "SALIR" necesito que se cierren todas las conexiones activas a la base de datos y luego cierre la aplicación.

    ¿me podéis decir como se obtienen y cierran todas las posibles conexiones a la base de datos?

    por ahora estoy usando la sentencia "close()" pero no sé si esto es suficiente para cerrar convenientemente las conexiones.

    Gracias por la ayuda












    • Editado JotaQ jueves, 14 de mayo de 2015 7:54
    jueves, 14 de mayo de 2015 7:54

Respuestas

  • El problema es que temo no estar haciendo lo correcto manteniendo la conexiónabierta mientras estoy trabajando en el form

    Lo que necesito es saber cuál es la metodología estándar / correcta [...]


    La recomendación más habitual es la de no mantener la conexión abierta, ni siquiera cuando estés trabajando dentro de un Form. En lugar de eso, cada vez que tengas que hacer algo con la conexión (por ejemplo, cuando pulsan un botón de "grabar" en el form), entonces abres la conexión, la usas y la vuelves a cerrar. Recuerda que cuando decimos "abrir" y "cerrar", en realidad lo que ocurre internamente es que "se recupera desde el pool" y "se devuelve al pool", pero no se cierra de verdad. Esta operación de tomar y devolver desde el pool es muy rápida, por lo que esta forma de operar no perjudica el rendimiento.
    jueves, 14 de mayo de 2015 15:04

Todas las respuestas

  • Cómo usas las conexiones a tu BBDD??

    Deberías hacer lo siguiente (te lo escribo en C#). Las conexiones se abren y se cierran localmente en cada llamada. No es bueno tener una cnoexion abierta a nivel de aplicación.

    Para ello emplea los bloques using{} que te garantizan que la conexión se cierra y se libera.

    using (SqlConnection connection = new SqlConnection(connectionString))
        {
            // Tu código
        }


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 14 de mayo de 2015 8:37
  • Cómo usas las conexiones a tu BBDD??

    Deberías hacer lo siguiente (te lo escribo en C#). Las conexiones se abren y se cierran localmente en cada llamada. No es bueno tener una cnoexion abierta a nivel de aplicación.

    Para ello emplea los bloques using{} que te garantizan que la conexión se cierra y se libera.

    using (SqlConnection connection = new SqlConnection(connectionString))
        {
            // Tu código
        }

    Entiendo por lo que me dices que hay que abrir y cerrar la conexión lo antes posible... entonces puedes decirme por favor cual es la forma adecuada de gestionar una tabla cuando estoy haciendo altas, bajas, borrados, modificaciones, etc. no sé si me explico... lo que hago en el formulario es:

    1) Tengo un dataset creado

    2) abro conexion

    3) cargo la tabla en un dataAdapter con FILL

    4) hago operaciones; me muevo por los registro, hago altas, bajas

    5) cierro conexiones y salgo del form

    Si esto no es correcto ¿puedes decirme cual es el procedimiento adecuado?

    Gracias miles!!!


    jueves, 14 de mayo de 2015 9:32
  • Te hago una observación que es aplicable tanto en el caso de que uses Close(), como mencionas, como si usas el "using" que te indica Sergio, que internamente llama a Dispose() el cual llama a Close():

    Con esta instrucción no se cierra realmente la conexión. Lo que ocurre es que se devuelve al Pool, con lo que queda disponible para que la próxima vez que hagas un Open() no haya que abrir realmente una conexión, sino que se recupera la que antes devolviste al Pool. Esto implica que aunque el programa cree que la conexión se ha cerrado, desde el punto de vista de SQL Server la conexión todavía está abierta, cosa que puedes verificar desde el SQL Server con un comando tal como, por ejemplo, sp_who.

    El Pool de conexiones forma parte del AppDomain, por lo que se cierra cuando se descarga el AppDomain. Si tu programa es un .exe, el AppDomain se cierra al cerrar el ejecutable, por lo que todas las conexiones quedarán cerradas en cuanto salgas del programa.

    Si por alguna razón necesitas cerrar todas las conexiones a la base de datos antes de salir del programa (por ejemplo, si quieres restaurar un backup, que no se puede hacer mientras hay conexiones abiertas), entonces puedes pasarla a modo "mono-usuario" enviándole un comando del tipo "alter database ser single_user with rollback immediate". Lógicamente, este comando deberías enviarlo desde una conexión abierta contra otra base de datos diferente.

    • Propuesto como respuesta Sergio Parra jueves, 14 de mayo de 2015 9:34
    jueves, 14 de mayo de 2015 9:33
  • Buenos días,

    para realizar un cierre de la conexión es tratar en los lugares donde estas usando la conexión el Using.

    Como indica el compañero no hace falta hacer un Close() en ningun momento ya que cuando acaba el using hace el dispose , entonces ya cierra la conexión.

    Si por codigo te interesa más mantener durante un tiempo no hay problema (siempre y cuando no cierres la aplicación que lo ejecuta). 

    En definitiva si estas ejecutando la aplicación y en cada vez que quieras cerrar la conexión durante el uso de aplicación utiliza using(s) en el codigo. Si por otro lado quieres mantenerlo en el pool y poder reutilizar y solo al cerrar la aplicación cierre todas las conexiones manten el Close().

    Espero haberte ayudado

    jueves, 14 de mayo de 2015 10:02
  • Buenos días,

    para realizar un cierre de la conexión es tratar en los lugares donde estas usando la conexión el Using.

    Como indica el compañero no hace falta hacer un Close() en ningun momento ya que cuando acaba el using hace el dispose , entonces ya cierra la conexión.

    Si por codigo te interesa más mantener durante un tiempo no hay problema (siempre y cuando no cierres la aplicación que lo ejecuta). 

    En definitiva si estas ejecutando la aplicación y en cada vez que quieras cerrar la conexión durante el uso de aplicación utiliza using(s) en el codigo. Si por otro lado quieres mantenerlo en el pool y poder reutilizar y solo al cerrar la aplicación cierre todas las conexiones manten el Close().

    Espero haberte ayudado

    Gracias Carlos... muy buen apunte. El problema es que temo no estar haciendo lo correcto manteniendo la conexiónabierta mientras estoy trabajando en el form

    Lo que necesito es saber cuál es la metodología estándar / correcta para manejar una tabla sql server desde visual studio, y cuando digo manejar me refiero a hacer altas, bajas, moverse por los registros, etc.

    Gracias

    jueves, 14 de mayo de 2015 10:13
  • HOla JotaQ,

    no existe una form standard como tal, si te miras el patron repository seguramente es el que mejor se puede adaptar a tus altas bajas etc.

    te dejo un link al patron si aun puedes usar ese patron es el mejor para tu caso. Porque trabajaras con los datos mediante un patron muy extendido y que es de lo mejor que se puede utilizar para trabajar con datos de base datos.

    Te dejo un link de alguien que a implementado dicho patrón.

    http://www.eltavo.net/2014/08/patrones-implementando-patron_13.html

    espero que te sirva si tienes alguna duda más coméntemelo.

    jueves, 14 de mayo de 2015 13:55
  • El problema es que temo no estar haciendo lo correcto manteniendo la conexiónabierta mientras estoy trabajando en el form

    Lo que necesito es saber cuál es la metodología estándar / correcta [...]


    La recomendación más habitual es la de no mantener la conexión abierta, ni siquiera cuando estés trabajando dentro de un Form. En lugar de eso, cada vez que tengas que hacer algo con la conexión (por ejemplo, cuando pulsan un botón de "grabar" en el form), entonces abres la conexión, la usas y la vuelves a cerrar. Recuerda que cuando decimos "abrir" y "cerrar", en realidad lo que ocurre internamente es que "se recupera desde el pool" y "se devuelve al pool", pero no se cierra de verdad. Esta operación de tomar y devolver desde el pool es muy rápida, por lo que esta forma de operar no perjudica el rendimiento.
    jueves, 14 de mayo de 2015 15:04