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:
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 :
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]
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
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:
con.QueryDataReader("update departamentos set nombre='" & txtNomDepto.Text & "' where nombre='" & lblNomDepto.Text & "'")
Otro ejemplo es:
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
usa las exepciones de sqldataexepcion o algo asi, eso te cantan la posta y borra el return nothing
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.
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 Catch ex As MySql.Data.MySqlClient.MySqlException
pero no me devuelve error >:(
Sigo buscando soluciones, gracias...
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:
(http://www.freeimagehosting.net/t/i53go.jpg) (http://www.freeimagehosting.net/i53go)
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..
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
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