none
Consulta acerca de Try Catch y variables con conexion a datos RRS feed

  • Pregunta

  • Hola, tengo una rutina que esta funcionando Ok pero me surge una duda acerca de las variables con conexión a datos declaradas dentro de Try Catch.

    El código sería algo así

    Try    
             Using conn As New MySqlConnection(My.Settings.CnnSQL)
             conn.Open()
    
                Using cmd As New MySqlCommand()
                     cmd.Connection = conn
                     Dim reader As MySqlDataReader
                     cmd.CommandType = CommandType.Text
    
    
    '....
    '.....
    
                     reader.Close()
                        conn.Close()
                    End Using
                End Using
                Return "Ok"
            Catch ex As Exception
    
                Return ex.Message & vbCrLf & "Stacktrace: " & ex.StackTrace
            End Try

    ¿Que ocurre si ocurre un error antes de que se ejecute la linea reader.Close()?

    ¿Las conexiones se cierran correctamente?

    ¿Debería usar otro Using para "reader"? Pues dentro del Catch las variables reader y conn no existen.

    No estoy seguro de si estoy haciendo bien el cerrado de las conexiones.

    Creo que alguna vez me dijeron que las conexiones a bases de datos en realidad quedan en un pool porque cuesta mucho estar abriendo y cerrando conexiones.

    ¿Seria mejor si creara una clase o modulo aparte y en vez de hacer una conexión nueva en cada subrutina en la aplicación?

    Lo que quiero es optimizar la aplicación para que no se congele la GUI en caso de que la base de datos no conteste por la razón que sea.

    Cualquier sugerencia respecto al tema será bienvenida, gracias.


    The Real Blue


    martes, 26 de febrero de 2013 13:54

Todas las respuestas

  • ¿Las conexiones se cierran correctamente?

    al declarar el objeto de conexion dentro del using esto hace que al salir de ese bloque la conexion se cierre automaticamente

    ¿Debería usar otro Using para "reader"? Pues dentro del Catch las variables reader y conn no existen.

    no creo porque recuerda que ya esta dentro de bloques using, por lo tanto al salir de estos los objetos contenidos tambien se destruyen

    No estoy seguro de si estoy haciendo bien el cerrado de las conexiones.

    si eso es correcto

    Creo que alguna vez me dijeron que las conexiones a bases de datos en realidad quedan en un pool porque cuesta mucho estar abriendo y cerrando conexiones.

    si eso es verdad, ado.net de forma interna administra un pool de conexiones con lo cual al cerrar la conexion no se realiza inmediatamente sino que se mentiene un tiempo para optimizar las conexiones siguientes

    ¿Seria mejor si creara una clase o modulo aparte y en vez de hacer una conexión nueva en cada subrutina en la aplicación?

    no lo veo una buena idea, estas clases terminan teniendo logica que complican el codigo, mas que ayudarlo

    si quieres crea clases de negocio que encapulen funcionalidad, pero no una clase que administre la conexion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 26 de febrero de 2013 14:07
  • Ah, ok, gracias por la pronta respuesta.

    Lo de la clase se me ocurrió como forma de solucionar los "cuelgues" de la GUI cuando la base no responde.

    En realidad no se cuelga pero trabaja mucho mas lento; tal vez debería disminuir el timeout de las querys porque todas las querys no demoran mas de 1 segundo en ejecutarse, usualmente tardan menos de 50mS, asi que si no responden en menos de un par de segundos cancelo la query y continuo con la ejecución del programa.

    ¿Que opinas?


    The Real Blue

    martes, 26 de febrero de 2013 14:43