none
Conectar y Desconectar de SQL Server RRS feed

  • Pregunta

  • Estimados, tengo una aplicacion multiusuario que trabaja sobre SQL Server 2012. La App basicamente graba filas en el SQL cada 25 segundos aproximadamente, a través de la lectura de un código de barras. Mi pregunta es la siguiente:  es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene conectarse al principio y solo desconectar al cerrar la aplicacion?. Consulto, porque esta misma APP trabajaba con ACCESS hasta hace un mes y tenia que conectarme y desconectarme para cada lectura, ya que de la otra manera me volvia loco el tema del bloqueo de los registros, cada tanto se colgaban todas las aplicaciones.

    Bueno gente gracias de antemano y aguardo consejos.

    Saludos!

    Pablo

    martes, 15 de mayo de 2012 19:06

Respuestas

  • No hace falta configurar ningún parámetro adicional, tal como lo tienes está bien. De forma predeterminada el pool queda activado. Tendrías que meter un parámetro adicional en el caso contrario, es decir, si desearas DESACTIVAR el pool.

    • Marcado como respuesta pianpa miércoles, 16 de mayo de 2012 10:43
    miércoles, 16 de mayo de 2012 10:08

Todas las respuestas

  • Hola,

    Ese tema de abrir y cerrar la base de datos a cada rato tiene dos aristas. Estan los que dicen abrir y cerrar y los opositores que dicen abrir al iniciar la aplicacion y cerrar al salir.

    Si tenias problemas con Access seguro que estabas haciendo algo mal. Si usas los metodos del recordset para agregar las filas lo que tenes que hacer es cerrar el recordset luego de guardar. Si por el contrario usas codigo SQL para insertar registros deberias anidar las inserciones en una transaccion y luego de confirmar la transaccion forzar la grabacion del buffer del jet.

    martes, 15 de mayo de 2012 21:03
  • Hola Victor, efectivamente quise saber la opinión de los foreros, ya que en la web encontré gente a favor y gente en contra. Respecto a lo que me decis sobre el Access, seguramente estaba haciendo algo mal, pero la verdad es que le di muchas vueltas al asunto y me decidi migrar a SQL. Mi duda es si en SQL puedo llegar a tener las mismas complicaciones. Yo utilizaba el siguiente codigo en Access:'DEFINE LAS CONEXIONES

    'conectar a la BBDD

    Set con = New ADODB.Connection
    con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & RUTA & "';Jet OLEDB:Database Password=123"

    'Recordset para busquedas

     With rstR

         If .State = adStateOpen Then
             .Close
         End If
        .ActiveConnection = con
        .CursorLocation = adUseClient
        .CursorType = adOpenKeyset
        .LockType = adLockReadOnly
        .Properties("IRowsetIdentity") = True

        .Open "SELECT MODELO FROM MODELOS ORDER BY MODELO", , , , adCmdText

        .MoveFirst
        For i = 1 To .RecordCount
            If .EOF = True Then
                'MsgBox "SE CARGO TODO LO QUE HABIA"
                Exit For
                Else
                comboMODELO.AddItem rstR("MODELO")
                .MoveNext
             End If
        Next i
        .Close
    End With

    'Recordset para insertar registros

    With rst2
        If .State = adStateOpen Then
            .Close
        End If
        .ActiveConnection = con
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockOptimistic
        .Properties("IRowsetIdentity") = True

        .Open "INSERT INTO TABLE(FECHA,SN,MODELO,ESTADO,USUARIO) VALUES (NOW(), '" & txtC.Text & "','" & comboMODELO & "','PASS','" & USUARIO  & "')", , adOpenStatic, adLockOptimistic, adCmdText
        etiERROR.ForeColor = vbBlue
        etiERROR = "LA RELACION FUE EXITOSA"
    End With

    Que puede ser que esté mal?. El error que me salía era que al momento de querer hacer algún insert, el registro está bloqueado y me colgaba en cascada todas las terminales.

    Saludos!



    martes, 15 de mayo de 2012 21:56
  • [...] es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene [sic] conectarse al principio y solo desconectar al cerrar la aplicacion?.

    Si estás usando una método de acceso a datos de los que automáticamente gestionan el pool de conexiones (por ejemplo, conectas por medio de OleDb), entonces la recomendación es que abras y cierres la conexión cada vez que quieras usarla. Internamete, y sin que tú hagas nada, el pool hace la gestión necesaria para que al cerrar la conexión no se cierre de verdad, sino que se devuelve al pool. Cuando vuelves a abrirla, no se abre de verdad, sino que se recupera del pool la que ya estaba abierta. De esa forma, no se pierde nada de tiempo en abrir la conexión, y se optimiza el número total de conexiones abiertas en cada momento porque el pool se encarga de gestionarlas. Jugando con los parámetros de la cadena de conexión se puede habilitar o deshabilitar el pool, así como cambiarle los parámetros, tales como el tiempo que una conexión permanece abierta en el pool antes de cerrarse realmente.

     

    miércoles, 16 de mayo de 2012 7:11
  • [...] es preferible que cada vez que termine de leer un dato me desconecte de la BBDD, para luego conectarme en la rpoxima lectura (25 segundos)? o combiene [sic] conectarse al principio y solo desconectar al cerrar la aplicacion?.

    Si estás usando una método de acceso a datos de los que automáticamente gestionan el pool de conexiones (por ejemplo, conectas por medio de OleDb), entonces la recomendación es que abras y cierres la conexión cada vez que quieras usarla. Internamete, y sin que tú hagas nada, el pool hace la gestión necesaria para que al cerrar la conexión no se cierre de verdad, sino que se devuelve al pool. Cuando vuelves a abrirla, no se abre de verdad, sino que se recupera del pool la que ya estaba abierta. De esa forma, no se pierde nada de tiempo en abrir la conexión, y se optimiza el número total de conexiones abiertas en cada momento porque el pool se encarga de gestionarlas. Jugando con los parámetros de la cadena de conexión se puede habilitar o deshabilitar el pool, así como cambiarle los parámetros, tales como el tiempo que una conexión permanece abierta en el pool antes de cerrarse realmente.

     

      Alberto gracias por tu respuesta, la verdad no conocía el concepto del pool. Yo me estoy conectando de esta manera :

    Set con = New ADODB.Connection
    con.Open "Provider=SQLOLEDB; Initial Catalog=AAA; Data Source=10.0.0.1;", "user", "pass"

    y luego para desconectarme solo hago:

    con.close

    set con=nothing

    Debería agregar algún parámetro adicional para que el pool trabaje correctamente?

    Gracias!

    Pablo D.

    miércoles, 16 de mayo de 2012 9:01
  • No hace falta configurar ningún parámetro adicional, tal como lo tienes está bien. De forma predeterminada el pool queda activado. Tendrías que meter un parámetro adicional en el caso contrario, es decir, si desearas DESACTIVAR el pool.

    • Marcado como respuesta pianpa miércoles, 16 de mayo de 2012 10:43
    miércoles, 16 de mayo de 2012 10:08
  • Perfecto Alberto. Muchas Gracias!

    Pablo D.

    miércoles, 16 de mayo de 2012 10:44
  • Hola,

    Si me permitis tu codigo deberia ser algo asi:

    Llenar el Combo Modelo:

    Esta rutina presupone una conexion abierta a la base de datos

        Dim rstR As ADODB.Recordset
        Set rstR = New ADODB.Recordset
       
        comboMODELO.Clear
           
        With rstR
       
            Set .ActiveConnection = Con
            .Source = "SELECT MODELO FROM MODELOS ORDER BY MODELO"
            .CursorLocation = adUseClient
            .CursorType = adOpenStatic
            .LockType = adLockReadOnly
            .Open , , , , adCmdText

            Do Until .EOF
                comboMODELO.AddItem rstR("MODELO")
                .MoveNext
            Loop
           
            .Close
       
        End With

        Set rstR = Nothing

    Funcion para Insertar el registro:

    Esta funcion recibe los parametros y devuelve True o False segun sea si la insercion fue exitosa o no. El mensaje de error podes sacarlo, habria que ver como juega el objeto etiERROR, tal vez eso lo debas manejar dentro del cuerpo de tu programa con el resultado True o False de la llamada a la funcion.

    Function InsertarRelacion(Con As ADODB.Connection, SN As String, Modelo As String, Usuario As String) As Boolean
       
        On Error GoTo ErInsertar
       
        Dim SwTansac As Boolean
        Dim StrError As String
        Dim Sentencia As String
       
        Sentencia = "INSERT INTO TABLE("
        Sentencia = Sentencia & "FECHA,"
        Sentencia = Sentencia & "SN,"
        Sentencia = Sentencia & "MODELO,"
        Sentencia = Sentencia & "ESTADO,"
        Sentencia = Sentencia & "USUARIO"
        Sentencia = Sentencia & ") VALUES ("
        Sentencia = Sentencia & "NOW(),"
        Sentencia = Sentencia & "'" & SN & "',"
        Sentencia = Sentencia & "'" & Modelo & "',"
        Sentencia = Sentencia & "'PASS',"
        Sentencia = Sentencia & "'" & Usuario & "'"
        Sentencia = Sentencia & ")"
       
        Con.BeginTrans
            SwTansac = True
            Con.Execute Sentencia, , adCmdText + adExecuteNoRecords
        Con.CommitTrans
        Call RefrescarJet(Con)
        etiERROR.ForeColor = vbBlue
        etiERROR = "LA RELACION FUE EXITOSA"
        InsertarRelacion = True

        Exit Function

    ErInsertar:
        If SwTansac Then
            Con.CommitTrans
        End If
        StrError = "Error Nº: " & Err.Number & vbCrLf & vbCrLf
        StrError = StrError & "   " & Err.Description & vbCrLf & vbCrLf
        StrError = StrError & "   (Origen: " & Err.Source & ")" & vbCrLf
        If Err.HelpFile <> "" Then
            StrError = StrError & "   (Archivo de Ayuda: " & Err.HelpFile & ")" & vbCrLf
            StrError = StrError & "   (Contexto de Ayuda: " & Err.HelpContext & ")" & vbCrLf
        End If
        MsgBox StrError, vbCritical, "Insertando Relación"
        DoEvents
        etiERROR.ForeColor = vbRed
        etiERROR = "LA RELACION NO SE PUDO COMPLETAR"
        Err.Clear

    End Function

    Rutina para refrescar el buffer del Jet, solo para bases de datos Access:

    Tenes que agregar a tu proyecto la referencia "Microsoft Jet and replication Object .."

    Sub RefrescarJet(Base As ADODB.Connection)
       
        On Error Resume Next
       
        Dim JRO As JRO.JetEngine
        Set JRO = New JRO.JetEngine
       
        JRO.RefreshCache Base
       
        Set JRO = Nothing
       
        On Error GoTo 0

    End Sub

    miércoles, 16 de mayo de 2012 13:58
  • Upsss !!!, me equivoque:

    Donde Dice:

        If SwTansac Then
            Con.CommitTrans
        End If

    Deberia decir:

        If SwTansac Then
            Con.RollbackTrans

        End If

    miércoles, 16 de mayo de 2012 14:13
  • Perfecto Victor. Voy a probarlo.

    Muchas gRacias!

    miércoles, 16 de mayo de 2012 14:42
  • Hola pianpa,

    Probalo y contame como anduvo.

    miércoles, 16 de mayo de 2012 14:51