Inicio Foros Lenguajes de programación, desarrollo, código fuente .Net System.ObjectDisposedException No se puede obtener acceso al objeto desechado

Este debate contiene 7 respuestas, tiene 2 mensajes y lo actualizó Avatar Varios hace 3 semanas, 3 días.

Viendo 8 publicaciones - del 1 al 8 (de un total de 8)
  • Autor
    Publicaciones
  • #3673
    Avatar
    Varios
    Moderador

    Hola, estoy desarrollando una aplicación en Visual Studio .Net C# con acceso a MySQL. Para el acceso uso los drivers nativos de MySQL para .Net.

    Antes de añadir la referencia a la DLL de MySQL y de usar la conexión a MySQL la aplicación iba bien, pero desde que conecto con la base de datos para hacer select, insert y update, al principio me funciona, pero pasados unos minutos me sale este error:

    System.ObjectDisposedException
    HResult=0x80131622
    Mensaje = No se puede obtener acceso al objeto desechado.
    Nombre del objeto: ‘System.Net.Sockets.NetworkStream’.
    Origen = System
    Seguimiento de la pila:
    en System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
    en MySql.Data.MySqlClient.TimedStream.Read(Byte[] buffer, Int32 offset, Int32 count)
    en MySql.Data.MySqlClient.MySqlStream.ReadFully(Stream stream, Byte[] buffer, Int32 offset, Int32 count)
    en MySql.Data.MySqlClient.MySqlStream.LoadPacket()
    en MySql.Data.MySqlClient.MySqlStream.ReadPacket()
    en MySql.Data.MySqlClient.NativeDriver.FetchDataRow(Int32 statementId, Int32 columns)
    en MySql.Data.MySqlClient.Driver.FetchDataRow(Int32 statementId, Int32 columns)
    en MySql.Data.MySqlClient.Driver.SkipDataRow()
    en MySql.Data.MySqlClient.ResultSet.Close()
    en MySql.Data.MySqlClient.MySqlDataReader.NextResult()
    en MySql.Data.MySqlClient.MySqlDataReader.Close()
    en MySql.Data.MySqlClient.MySqlConnection.Close()
    en MySql.Data.MySqlClient.MySqlConnection.Dispose(Boolean disposing)
    en MySql.Data.MySqlClient.MySqlConnection.Finalize()

    Y la aplicación entera deja de funcionar.

    ¿A qué puede ser debido?

    En principio capturo los errores en el código, por ejemplo:

     

    Pero me sigue dando el error y la aplicación se cierra, no lo captura.

    #3674
    alonsojpd
    alonsojpd
    Jefe de claves

    Pásanos el código C# que usas para la conexión con la base de datos MySQL.

    #3675
    Avatar
    Varios
    Moderador

    Este es el procedimiento que conecta con el servidor MySQL:

     

    #3676
    alonsojpd
    alonsojpd
    Jefe de claves

    El causante del problema puede ser el parámetro pooling=false de tu string de conexión. Cuando usas este parámetro a false estás indicando al motor de base de datos que cuando cierres la conexión con el servidor, en tu caso cuando haces:

    conexionBD.Close();

    Se cierra completamente, por lo que en la siguiente consulta has de volver a conectarte al servidor por completo y esto suele ser muy costoso. Si en todos tus procedimientos, como en el que nos has pasado de ejemplo, haces un:

    conexionBD.Close();

    y un

    conexionBD.Open();

    Por cada proceso de cada usuario que use tu aplicación y por cada procedimiento/función que internamente use la base de datos hará un close y un open, con el consiguiente consumo de recursos, pudiendo llegar a probar el error que nos comentas.

     

    Puedes probar a cambiar el parámetro pooling a true, quedando tu código así:

    Aunque deberías revisar el código para no hacer un close y open con cada consulta que ejecutas. Sería mucho más eficiente hacer un único open de la conexión durante una sesión.

    #3677
    Avatar
    Varios
    Moderador

    He puesto el pooling=true y ahora me va mucho mejor, me aguanta más tiempo y más conexiones. Por lo que seguramente es lo que dices, el close y open continuo. Que como al poner el pooling=true por lo que he leído indica al motor de base de datos que aunque se haga un close no se cierra la conexión realmente, y por eso me aguanta más.

    Pero ahora me sale, cuando hay muchas conexiones, este error:

    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

    #3678
    alonsojpd
    alonsojpd
    Jefe de claves

    Efectivamente el error se te estaba produciendo por el continuo close/open de la conexión con el servidor de MySQL.

    Con pooling=true, como bien dices, se evita en cierta medida el problema, pero no del todo. El nuevo error que te aparece es porque superas el valor del parámetro max_pool_size.

    Sin duda te recomiendo que revises el código y hagas una única conexión (open) al principio del programa y una desconexión al final (close).

    #3680
    alonsojpd
    alonsojpd
    Jefe de claves

    Pásanos algún ejemplo del código que uses para los updates y los insert de tu aplicación.

    #3681
    Avatar
    Varios
    Moderador

    Os paso un ejemplo de update:

    Otro de insert y update:

     

    Otro de select:

     

Viendo 8 publicaciones - del 1 al 8 (de un total de 8)

Debes estar registrado para responder a este debate.