Foros del Web » Programación para mayores de 30 ;) » .NET »

Problemas para cerrar conexiones mysql en visual basic .net 2005

Estas en el tema de Problemas para cerrar conexiones mysql en visual basic .net 2005 en el foro de .NET en Foros del Web. Hola a todos. He estado a pregunte y pregunte cosas por un sistema que estoy desarrollando y hoy surgio un detalle grave a mi parecer ...
  #1 (permalink)  
Antiguo 13/06/2011, 15:43
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Problemas para cerrar conexiones mysql en visual basic .net 2005

Hola a todos.

He estado a pregunte y pregunte cosas por un sistema que estoy desarrollando y hoy surgio un detalle grave a mi parecer que no tome en cuenta y que aunque hay forma de solucionar con un "parche", haria que cambie casi todo el codigo del sistema y el sistema esta casi terminado.

El problema que tengo es que no cierro las conexiones que hago al hacer alguna consulta, así sea de select, insert, etc. En si el problema lo veo con los selects al moverse de un renglon a otro en un datagridview que hace una consulta cada vez que se pasa de renglon.

Estoy usando el patron visitor y no encuentro como cerrar cada conexion que se va abriendo, despues de obtener la informacion de la base de datos pues si cierro la conexion en funcion Visit (del patron visitor) despues de asignar un datareader a mi objeto, ya no me permite usarlo.

Esto es un pedazo del codigo del visit y del boton donde se hace la visita:

metodo Visit
Código C++:
Ver original
  1. Public Overrides Sub Visit(ByVal objArticulos As Clase_Articulos)
  2.         Dim datosarticulo As String() = objArticulos.DatosArticulo
  3.  Try            
  4.             _oManejador.AbrirConexion()
  5. _oManejador.Conexion.Open()
  6.             Select Case objArticulos.Opc
  7.                Case 3
  8.                     _oManejador.Consulta = "SELECT AR.* FROM articulos AS AR, categorias AS CT, articulos_categorias AS AC WHERE CT.ct_nombre='" + datosarticulo(0) + "' AND AR.ar_id=AC.ar_id AND CT.ct_id=AC.ct_id and AR.ar_id>" + datosarticulo(1) + " LIMIT 2;"
  9.  
  10.  
  11. _oManejador.EjecutaConsulta()
  12.             objArticulos.Lector = _oManejador.Lector  
  13. end sub
Si debajo de la ultima linea cierro la conexion ya no me deja trabajar con el lector

Este es el codigo del evento que en teoria usarian muchos los usuarios y que por consiguiente me causa el problema de limite de conexiones superadas.

Código C++:
Ver original
  1. Private Sub DGArticulo_KeyUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DGArticulo.KeyUp
  2.         If e.KeyValue = 40 Then          
  3.             If DGArticulo.CurrentRow.Index = DGArticulo.Rows.Count - 1 Then
  4.                 Dim datosarticulo As String()
  5.                 _oArticulo = New Clase_Articulos
  6.                 If CBFiltroCategoria.SelectedIndex = 0 Or CBFiltroCategoria.SelectedIndex = -1 Then
  7.                     _oArticulo.Opc = 17
  8.                     ReDim datosarticulo(0)
  9.                     datosarticulo(0) = DGArticulo.Item(0, DGArticulo.CurrentRow.Index).Value
  10.                 Else
  11.                     _oArticulo.Opc = 3
  12.                     ReDim datosarticulo(1)
  13.                     datosarticulo(0) = CBFiltroCategoria.SelectedItem
  14.                     datosarticulo(1) = DGArticulo.Item(0, DGArticulo.CurrentRow.Index).Value
  15.                 End If
  16.  
  17.                 _oArticulo.DatosArticulo = datosarticulo
  18.                 Dim _oElem As Elemento
  19.                 _oElem = _oArticulo
  20.  
  21.                 Dim Consulta As Visitor = New VisitanteConsulta()
  22.                 _oElem.Accept(Consulta)
  23.                 Lector = _oArticulo.Lector
  24.  
  25.                 While Lector.Read()
  26.  
  27.                     DGArticulo.Rows.Add(Lector("ar_id").ToString(), Lector("ar_codigoarticulo").ToString(), Lector("ar_nombre").ToString(), Lector("ar_descripcion").ToString())
  28.  
  29.                 End While                                    
  30.             End If
  31.         End If
  32.     End Sub

Se que el codigo no es el mas optimizado ni mejor pensado, aun asi, espero me puedan ayudar y que los cambios que tenga que hacer no sean muchos por que enserio, el sistema es muy grande.
  #2 (permalink)  
Antiguo 13/06/2011, 16:10
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Necesitaría ver que tienes en


_oManejador.EjecutaConsulta()

¿?

Saludos
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #3 (permalink)  
Antiguo 13/06/2011, 16:35
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Cita:
Iniciado por RootK Ver Mensaje
Necesitaría ver que tienes en


_oManejador.EjecutaConsulta()

¿?

Saludos
Código C++:
Ver original
  1. Public Sub EjecutaConsulta()
  2.         _comando.CommandText = _consulta 'Se asigna la cadena de consulta a ser ejecutada por el objeto comando
  3.  
  4.        If _lector IsNot Nothing Then
  5.            _lector.Dispose() 'si el lector de datos no esta vacio lo limpia (esto como seguridad para evitar problemas con la instruccion de la siguiente linea de código
  6.         End If
  7.         _lector = _comando.ExecuteReader() 'Se ejecuta la consulta, comando ya sabe los datos de conexion y la cadena de consulta
  8.        'Se asigna al lector de datos el resultado devuelto por la consulta ejecutado por comando.
  9.  
  10.     End Sub
  #4 (permalink)  
Antiguo 13/06/2011, 16:46
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Para ser sincero está medio extraña tu implementación, sin embargo atendiendo tu solicitud podrías hacer algo como ésto:


Código:
_lector = _comando.ExecuteReader(CommandBehavior.CloseConnection) 'Se ejecuta la consulta, comando ya sabe los datos de conexion y la cadena de consulta
y donde lo mandas a llamar después del while cierras el objeto para que cierres también la conexión


Código:
While Lector.Read()
 
                    DGArticulo.Rows.Add(Lector("ar_id").ToString(), Lector("ar_codigoarticulo").ToString(), Lector("ar_nombre").ToString(), Lector("ar_descripcion").ToString())
 
                End While               
Lector.Close()
Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #5 (permalink)  
Antiguo 14/06/2011, 05:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Ten en cuenta que abrir y cerrar constantemente conexiones te traerá al menos cuatro tipos de problemas:
- Saturarás el pool de conexiones de Widows. Windows no libera los recursos tan rápido (la solución está en que la conexión no se declare en el pool).
- El overhead puesto por la apertura te terminará consumiendo demasiado tiempo. En un proceso de consulta a un DBMS, la apertura de la conexión es lo que más tiempo insume.
- Si el user de la base tiene un límite de conexiones por hora (parámetro de permisos de ese usuario) tarde o temprano te quedarás sin poder acceder a la base.
- SI el servicio está en una web, la administración de host te puede cerrar el servicio por exceso de conexiones (alto tráfico).

O sea: no es buena práctica, en lo que a bases de datos se refiere, estar abriendo y cerrando constantemente conexiones. Lo que uscas bien lo podrías tratar de gestionar de otro modo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 14/06/2011, 08:25
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Ten en cuenta que abrir y cerrar constantemente conexiones te traerá al menos cuatro tipos de problemas:
- Saturarás el pool de conexiones de Widows. Windows no libera los recursos tan rápido (la solución está en que la conexión no se declare en el pool).
- El overhead puesto por la apertura te terminará consumiendo demasiado tiempo. En un proceso de consulta a un DBMS, la apertura de la conexión es lo que más tiempo insume.
- Si el user de la base tiene un límite de conexiones por hora (parámetro de permisos de ese usuario) tarde o temprano te quedarás sin poder acceder a la base.
- SI el servicio está en una web, la administración de host te puede cerrar el servicio por exceso de conexiones (alto tráfico).

O sea: no es buena práctica, en lo que a bases de datos se refiere, estar abriendo y cerrando constantemente conexiones. Lo que uscas bien lo podrías tratar de gestionar de otro modo.
Como?
Puedo modificar la configuracion del servidor de base de datos si es necesario.
  #7 (permalink)  
Antiguo 14/06/2011, 08:38
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Cita:
Iniciado por RootK Ver Mensaje
Para ser sincero está medio extraña tu implementación, sin embargo atendiendo tu solicitud podrías hacer algo como ésto:


Código:
_lector = _comando.ExecuteReader(CommandBehavior.CloseConnection) 'Se ejecuta la consulta, comando ya sabe los datos de conexion y la cadena de consulta
y donde lo mandas a llamar después del while cierras el objeto para que cierres también la conexión


Código:
While Lector.Read()
 
                    DGArticulo.Rows.Add(Lector("ar_id").ToString(), Lector("ar_codigoarticulo").ToString(), Lector("ar_nombre").ToString(), Lector("ar_descripcion").ToString())
 
                End While               
Lector.Close()
Salu2
No se si lo que dice el compañero soloyo sea tan perjudicial, lo que si se es que, FUNCIONA TU CODIGO que la verdad no entiendo muy bien la linea pero FUNCIONA y lo mejor de todo es que estando ahi, funciona para todo pues a fuerzas tienen que pasar por la clase manejadorbd.

Muchas gracias.

Aun asi, espero la respuesta del compañero soloyo.
  #8 (permalink)  
Antiguo 14/06/2011, 09:15
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Bueno, funciona pero me causa problemas en dos botones del apartado articulos (modificar y eliminar), me dice que no hay una conexion abierta (por ahi he de estar cerrandola pues otros botones de modiicar y eliminar si funcionan).
  #9 (permalink)  
Antiguo 14/06/2011, 11:38
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

- El problema de la saturación del pool es simple: Llega al límite y el S.O. no dará permiso de crear mas conexiones hasta que el pool se vaya liberando. Windows normalmente se toma algnos segndos para declarar libre esa conexión, y ese tiempo a veces es demasiado largo para alta concurrencia y muchas conexiones creadas en poco tiempo.
Otros problemas sobre ese asunto se pueden ver en la documentación oficial de MSDN: Troubleshooting MDAC Pooling Para evitar el problema a nivel de MySQL se debe usar el MySQL Connector.Net, porque el ODBC y el OleDb no tienen la opción "Pooling=false" para la cadena de conexión. Es propia del de MySQL.
A nivel de MySQL, las conexiones también puede quedar mal cerradas. Eso hace que cada tanto sea conveniente hacer un refresco de estado con FLUSH HOSTS.

- El problema de overhead se manifiesta cuando hay muchas operaciones de lectura/escritura realizadas en poco tiempo. Si vas a abrir una conexión cada vez que una de ellas ocurra, en una operación masiva el overhead se comienza a notar. Simplemente usa un buen analizador de sistema y verás cómo los recursos disponibles van descendiendo cuando hay demasiadas transacciones.

- La cantidad de conexiones a MySQL dependen de los permisos en la base de datos (ver MySQL: Sintaxis de GRANT y REVOKE). No es algo que puedas controlar desde la aplicación. En general los problemas de administración de los DBMS son ignorados u omitidos por los programadores, pero en aplicaciones con administración de usuarios en BBDD, son muy importantes.

- Respecto al exceso de tráfico en los servicio de hosting, es un problema conocido. Cuando contratas un servicio (pago o gratuito), ellos te fijan los límites de accesos poría y mes a tu site. Si quieres más accesos, cambia el tipo de cuenta. No es trascendente en una LAN, porque el servidor es una intranet.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 14/06/2011 a las 11:43
  #10 (permalink)  
Antiguo 14/06/2011, 18:58
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: Problemas para cerrar conexiones mysql en visual basic .net 2005

Pues ya solucione el problema de las conexiones y es por que en algunas partes hago mas de una consulta a la vez pero solo cierro una de las x conexiones, asi que pues le puse abrir y cerrar conexion en todas las partes, ademas de el lector.close en todas las partes y esta funcionando perfecto. De cualquier manera estare pendiente de las recomendaciones que aqui me dan cuando menos para la version 2 del programa por que esta, ya debe salir (aun faltaria hacerle pruebas exaustivas de todo tipo).

Etiquetas: basic, cerrar, conexiones, mysql, net, visual
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 19:40.