none
¿Cómo reseteo en este caso la conexión? RRS feed

  • Pregunta

  • Les explico:

    Estoy implementando una opción de copia de seguridad y restauración (aplicación VB NET), ya casi funciona, pero hay un detalle que aun no pude solucionar:

    Cada opción está en un formulario distinto. Suponiendo que ejecuto la copia de seguridad, cierro el formulario y abro la opción de restauración y la ejecuto, se ejecuta con normalidad.

    Per si hago lo siguiente: ejecuto la copia, abro un formulario de ingreso de datos, lo cierro y luego uso la opción de restauración ocurre que me sale este mensaje:

    ------------------------------------

    ------------------------------------

    Es como si la conexion quedara de manera "remanente" porque la abro dentro de un using y se supone que al cerrar el formulario de ingreso de datos se cierra esta también, sin embargo me sale el error en cuestión.

    La consulta es cómo fuerzo para que la conexión se cierre definitivamente antes de ejecutar el proceso de restauración.

    La base es de SQL Server y trabajo con la versión Standard 2014 y Visual Studio Pro 2015.



    • Editado James-2016 sábado, 9 de abril de 2016 4:08
    sábado, 9 de abril de 2016 4:07

Respuestas

  • Es como si la conexion quedara de manera "remanente" porque la abro dentro de un using y se supone que al cerrar el formulario de ingreso de datos se cierra esta también

    Te has topado con el POOL de conexiones. Cuando decimos que la conexión se "cierra", no es cierto que realmente se cierre. Lo que ocurre es que se devuelve al Pool de conexiones. La siguiente vez que abres una conexión, no se abre de verdad, sino que se recupera del Pool la que ya estaba abierta. Esto hace que sea muy rápido abrir y cerrar conexiones (porque no se abren y se cierran de verdad, sino que se toman y devuelven al pool), pero te fastidia el Restore porque desde el punto de vista de la base de datos la conexión se ve abierta (el servidor no sabe que en el lado cliente en realidad el programa no la está usando y la conexión está "parada" en el Pool).

    Para forzar el cierre de conexión cuando vayas a ejecutar el restore puedes enviar la sentencia "Alter Database [laBase] set single_user with rollback immediate". Esto debes hacerlo desde la master (no desde la propia base que intentas cerrar). Si después del Restore el programa continúa ejecutándose e intenta reutilizar la conexión del pool, le dará un error porque mientras tanto se la han cerrado sin que él lo sepa. Puedes interceptarlo con un try...catch y reintentar la operación, a la segunda funcionará bien.

    • Marcado como respuesta James-2016 sábado, 9 de abril de 2016 8:07
    sábado, 9 de abril de 2016 7:42

Todas las respuestas

  • Es como si la conexion quedara de manera "remanente" porque la abro dentro de un using y se supone que al cerrar el formulario de ingreso de datos se cierra esta también

    Te has topado con el POOL de conexiones. Cuando decimos que la conexión se "cierra", no es cierto que realmente se cierre. Lo que ocurre es que se devuelve al Pool de conexiones. La siguiente vez que abres una conexión, no se abre de verdad, sino que se recupera del Pool la que ya estaba abierta. Esto hace que sea muy rápido abrir y cerrar conexiones (porque no se abren y se cierran de verdad, sino que se toman y devuelven al pool), pero te fastidia el Restore porque desde el punto de vista de la base de datos la conexión se ve abierta (el servidor no sabe que en el lado cliente en realidad el programa no la está usando y la conexión está "parada" en el Pool).

    Para forzar el cierre de conexión cuando vayas a ejecutar el restore puedes enviar la sentencia "Alter Database [laBase] set single_user with rollback immediate". Esto debes hacerlo desde la master (no desde la propia base que intentas cerrar). Si después del Restore el programa continúa ejecutándose e intenta reutilizar la conexión del pool, le dará un error porque mientras tanto se la han cerrado sin que él lo sepa. Puedes interceptarlo con un try...catch y reintentar la operación, a la segunda funcionará bien.

    • Marcado como respuesta James-2016 sábado, 9 de abril de 2016 8:07
    sábado, 9 de abril de 2016 7:42
  • Gracias.
    sábado, 9 de abril de 2016 8:07