Mi Aplicacion se traba haciendo consultas conxecutivas a MySQL

Iniciado por luison, 9 Febrero 2013, 05:08 AM

0 Miembros y 1 Visitante están viendo este tema.

luison

Hola  a todos

Tengo una aplicación en vb.net + mysql. Donde para gestionar la interacción con mysql tengo una clase llamada clsDatabase. Cuando realizo consultas consecutivas mi aplicación se traba, como si se quedara congelada esperando algo, lo raro que no manda ningun mensaje de error, aunque le ponga la consulta dentro de un try.. catch.


Esta es mi clase para gestionar la base de datos:
Código (vbnet) [Seleccionar]

Imports Microsoft.VisualBasic
Imports System.Data
Imports MySql.Data.MySqlClient
Imports System.Configuration

Public Class clsDatabase
    Private objConn As MySqlConnection
    Private objCmd As MySqlCommand
    Private Trans As MySqlTransaction
    Private strConnString As String

    Public Sub New()
        strConnString = "server=" & iServer & "; uid=" & iUser & "; pwd=" & iPassword & "; port=" & iPuerto & "; database=" & iBaseDatos & ";connection timeout=3600;"
    End Sub

    Public Function QueryDataReader(ByVal strSQL As String) As MySqlDataReader
        Dim dtReader As MySqlDataReader
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        objCmd = New MySqlCommand(strSQL, objConn)
        dtReader = objCmd.ExecuteReader()
        Return dtReader '*** Return DataReader ***'
    End Function

    Public Function QueryDataSet(ByVal strSQL As String) As DataSet
        Dim ds As New DataSet
        Dim dtAdapter As New MySqlDataAdapter
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        objCmd = New MySqlCommand
        With objCmd
            .Connection = objConn
            .CommandText = strSQL
            .CommandType = CommandType.Text
        End With
        dtAdapter.SelectCommand = objCmd
        dtAdapter.Fill(ds)
        Return ds   '*** Return DataSet ***'
    End Function

    Public Function QueryDataTable(ByVal strSQL As String) As DataTable
        Dim dtAdapter As MySqlDataAdapter
        Dim dt As New DataTable
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        dtAdapter = New MySqlDataAdapter(strSQL, objConn)
        dtAdapter.Fill(dt)
        Return dt '*** Return DataTable ***'
    End Function

    Public Function QueryExecuteNonQuery(ByVal strSQL As String) As Boolean
        'MsgBox(strSQL)
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        Try
            objCmd = New MySqlCommand()
            With objCmd
                .Connection = objConn
                .CommandType = CommandType.Text
                .CommandText = strSQL
            End With
            objCmd.ExecuteNonQuery()
            Return True '*** Return True ***'
        Catch ex As Exception
            MsgBox("ERROR EN QueryExecuteNonQuery" & Err.Description, MsgBoxStyle.Exclamation)
            Return False '*** Return False ***'
        End Try
    End Function

    Public Function QueryExecuteScalar(ByVal strSQL As String) As Object
        Dim obj As Object
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        Try
            objCmd = New MySqlCommand()
            With objCmd
                .Connection = objConn
                .CommandType = CommandType.Text
                .CommandText = strSQL
            End With
            obj = objCmd.ExecuteScalar()  '*** Return Scalar ***'
            Return obj
        Catch ex As Exception
            MsgBox("ERROR:" & Err.Description)
            Return Nothing '*** Return Nothing ***'
        End Try
    End Function

    Public Function TransStart()
        objConn = New MySqlConnection
        With objConn
            .ConnectionString = strConnString
            .Open()
        End With
        Trans = objConn.BeginTransaction(IsolationLevel.ReadCommitted)
    End Function

    Public Function TransExecute(ByVal strSQL As String) As Boolean
        objCmd = New MySqlCommand()
        With objCmd
            .Connection = objConn
            .Transaction = Trans
            .CommandType = CommandType.Text
            .CommandText = strSQL
        End With
        objCmd.ExecuteNonQuery()
    End Function

    Public Function TransRollBack()
        Trans.Rollback()
    End Function

    Public Function TransCommit()
        Trans.Commit()
    End Function

    Public Sub Close()
        Try
            objConn.Close()
            objConn = Nothing
        Catch ex As Exception
           
        End Try
       
    End Sub

End Class





Realizo consultas normales, para cortes de caja, reportes, ventas etc.  Durante horas puede trabajar bien, pero despues de un tiempo la aplicacion se traba y no da mas.

Cuando inicio la aplicacion declaro una instancia de  la clase :
Código (vbnet) [Seleccionar]
Public con as new clsDatabase
Y utilizo esa instancia en todos los formularios, no creo que se trabe porque se llega al full de pools, o conexiones a mysql, puesto que mantengo solo una conexión desde el inicio.
A menos que la clase esté haciendo un mal manejo de las conexiones con mysql?

Les agradezco de antemano cualquier tip, aportación o sugerencia para solucionar el problema.

Gracias  :)

[/size]


_katze_

mira la conexion con la db la haces cuando inicializas la clase si instancias la clase mas de una vez puede estar el problema ahi

luison

Podría ser que se generen muchas conexiones y ese sea el problema, lo que no entiendo por qué no se genera el error en mi aplicacion.

Un ejemplo del uso de la instancia de la clase es:
Código (vbnet) [Seleccionar]

con.QueryDataReader("update departamentos set nombre='" & txtNomDepto.Text & "' where nombre='" & lblNomDepto.Text & "'")


Otro ejemplo es:
Código (vbnet) [Seleccionar]

lector = con.QueryDataReader("select * from departamentos")
        lstDeptos.Items.Clear()

        While lector.Read
            item = lstDeptos.Items.Add(lector(0))
            item.SubItems.Add(lector(1))
        End While
        lector.Close()


Espero sirva para que me compartan sus ideas.

Gracias

_katze_

usa las exepciones de sqldataexepcion o algo asi, eso te cantan la posta y borra el return nothing

HdM

Hola.

Citarno creo que se trabe porque se llega al full de pools, o conexiones a mysql, puesto que mantengo solo una conexión desde el inicio.

Yo creo que no sólo mantienes una cnx desde el inicio. Tienes 5 funciones en la clase que cada vez que son llamadas, abren una nueva cnx. Si por el uso que se le da a la app (y si tienes varios puestos ejecutándola) no se para de llamar estas funciones y no se van cerrando las cnx...

También puedes echar un vistazo a cómo tienes configurado el servidor y sus logs.

Un saludo.

- Nice to see you again -

luison

Tengo instalado xampp 1.7.3, configurado normal, con limite maximo de conexiones el que trae por default 151. Lo que estoy haciendo es en un modulo declarar:

Public Con as new clsDatabase

y utilizo esa instancia en toda la aplicacion. Lo que podria ser es que la funcion QueryDataReader abre una conexion a mysql en distintos formularios y ésta no se cierre hasta que la aplicacion se cierra al final del dia.
Solo es una pc donde esta corriendo mi sistema.
Ya agregue  los
Código (vbnet) [Seleccionar]
Catch ex As MySql.Data.MySqlClient.MySqlException pero no me devuelve error  >:(

Sigo buscando soluciones, gracias...

luison

Probablemente esto ayude. Realizando una venta se registra en diferentes tablas la transaccion:
1-En tabla de ventas
2-En detalle de ventas
3-En movimientos
4-Se actualizan inventarios

Todo ello genera en mysql dentro de procesos del servidor una imagen como la que comparto:

Es normal que se abran todos esos procesos  y se mantengan ahi?
O sera que el problema es porque se abren demadiados y jamas se cierran sino es que hasta varias horas despues cuando el sistema cierra las ventas del dia?

Gracias..

luison

Investigando veo que mysql tiene configurado el wait_timeout por default en 8 horas de espera, por tanto cada conexion  que abro permanece abierta toda la jornada de trabajo, lo que a la postre ocasiones una pila enorme de conexiones abiertas.
Quisiera pensar que eso es la causa de que mi aplicacion se traba. Cambie el wait_timeout a 30 segundos para que cada que pase ese tiempo mysql cierre todas las conexiones en estado sleep.

Que opinan ustedes?,,, Será la solucion?

Esperemos que sí  ;D

alister

Cita de: luison en 10 Febrero 2013, 03:33 AM
Investigando veo que mysql tiene configurado el wait_timeout por default en 8 horas de espera, por tanto cada conexion  que abro permanece abierta toda la jornada de trabajo, lo que a la postre ocasiones una pila enorme de conexiones abiertas.
Quisiera pensar que eso es la causa de que mi aplicacion se traba. Cambie el wait_timeout a 30 segundos para que cada que pase ese tiempo mysql cierre todas las conexiones en estado sleep.

Que opinan ustedes?,,, Será la solucion?

Esperemos que sí  ;D


pero tienes que cerrarlas tu, o reciclar las conexiones que tengas abiertas.

solo veo que New New New New New New ! ejejejeje
Back 2 business!