2009-11-10 16 views
12

¿Es inteligente mantener la conexión abierta durante toda la sesión? Hice una aplicación C# que se conecta a una base de datos MySql, el programa lee y escribe y la aplicación debe ejecutarse unas 10 horas al día sin parar.Conexión de MySql, ¿puedo dejarla abierta?

¿Hay algún riesgo asociado a mantener la conexión abierta en lugar de llamar a la función close() cada vez que ha arrancado algo de la base de datos y abrirlo de nuevo cuando necesita algo nuevo?

Respuesta

8

Dar una conexión abierta por un tiempo está muy bien, siempre y cuando:

  1. no tiene tantas conexiones al mismo tiempo de inactividad que se pulsa el límite de conexión de MySQL;

  2. no lo deje abierto para horas sin hacer nada. La conexión predeterminada de MySQL wait_timeout es de 8 horas; Deje una conexión inactiva por ese tiempo y la próxima vez que la use obtendrá un error "El servidor MySQL se ha ido".

+2

No hay nada realmente que ganar manteniendo la conexión abierta (suponiendo que el proveedor use la agrupación de conexiones). El proveedor oficial MySQL Connector/Net utiliza la agrupación de conexiones de forma predeterminada. El OP no menciona qué proveedor está utilizando en realidad, pero si admite la agrupación, entonces utilizaría una estrategia abierta tarde/finalizada y permitiría que el proveedor gestione las conexiones físicas subyacentes. – LukeH

+0

disculpa por agregar comentarios para el hilo viejo. Leí http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html, parece que siempre que su aplicación tenga varios subprocesos/transacciones, es una buena práctica asignar cada subproceso a una conexión distinta . Gracias. –

0

Si la aplicación está utilizando la conexión, no hay razón para cerrarla. Si no necesita la conexión, debe cerrarla. Si tuviera varias aplicaciones conectadas a la base de datos, tiene una cantidad fija de conexiones a esa base de datos. Es por eso que es mejor cerrar cuando hayas terminado y volver a abrir cuando lo necesites.

0

Desde el punto de vista de la seguridad, yo diría que es mejor para cerrarla después de una consulta, sólo para estar seguro de que ningún otro programa puede inyectar su propio cosas en la conexión abierta.

Como el rendimiento está conectado, es claramente mejor tener la conexión abierta todo el tiempo.

Su elección ^^

9

Dado que está utilizando ADO.NET, puede utilizar incorporado conexión de ADO.NET puesta en común de capacidades. De hecho, permítanme refinar eso: debe siempre use las capacidades de agrupamiento de conexiones integradas de ADO.NET. Al hacerlo, obtendrá el tiempo de ejecución de .NET para administrar sus conexiones de forma transparente en segundo plano. Mantendrá las conexiones abiertas durante un tiempo incluso si las cerró y las vuelve a utilizar si abre una nueva conexión. Esto es realmente rápido.

Asegúrese de mencionar en su cadena de conexión que desea conexiones agrupadas ya que podría no ser el comportamiento predeterminado.

Sólo se debe crear conexiones a nivel local cuando los necesite, ya que están reunidas en el backrgound lo que no hay sobrecarga en la creación de una nueva conexión:

using (var connection = SomeMethodThatCreatesAConnectionObject()) 
{ 
    // do your stuff here 
    connection.Close(); // this is not necessary as 
         // Dispose() closes it anyway 
         // but still nice to do. 
} 

así es como se supone que lo hacen en la red.

0

No, no veo ninguna razón para no dejar una conexión abierta y volver a usarla: después de todo, este es el punto detrás de las diversas tecnologías de grupo de conexiones que están a punto (aunque generalmente son reservadas para situaciones de subprocesos múltiples donde todos los trabajos funcionan en la misma fuente de datos).

Pero, para ampliar la respuesta por bobince, - solo porque no está cerrando la conexión, no suponga que algo más no: la conexión podría expirar, podría haber problemas de conexión o ciento un otras razones por las cuales tu conexión muere Debe suponer que la conexión puede no estar allí y agregar lógica al código para este caso de excepción.

0

No es una buena práctica en mi opinión mantener las conexiones abiertas. Otro aspecto que habla para el cierre de las conexiones en todo momento es la capacidad de escalado. Puede que ahora esté bien dejarlo abierto, pero ¿qué ocurre si tu aplicación se usa dos veces 3 veces la cantidad de usuarios? Es un dolor en el cuello volver atrás y cambiar todo el código. (Sé que lo he hecho :-)

0

Su problema se resolverá si usa la agrupación de conexiones en su código. No necesita abrir y cerrar la conexión para que pueda guardar recursos valiosos que se utilizan al abrir una conexión. Simplemente devuelve la conexión a un grupo que, cuando se solicita una conexión, devuelve una conexión inactiva.

Por supuesto que soy de la opinión, obtenga una instancia de la conexión, úsela, confirme/deshaga su trabajo y devuélvala al grupo. No recomendaría mantener la conexión abierta durante tanto tiempo.

0

Una cosa que no he visto en las otras respuestas, aún: en caso de que haya preparado declaraciones o tablas temporales, podrían bloquear los recursos del servidor hasta que se cierre la conexión. Pero, por otro lado, puede ser útil mantener la conexión por un tiempo en lugar de volver a crearlos cada cierto tiempo.

0

Pagará una penalización de rendimiento si constantemente está abriendo y cerrando conexiones. Podría ser aconsejable usar la agrupación de conexiones y un breve wait_timeout si le preocupa que demasiadas copias en ejecución de su aplicación se consuman demasiadas conexiones de bases de datos.

+0

Este no es el caso, esta es la única aplicación que se está ejecutando y nada más debe intentar conectarse. – Pieter888

+1

No hay ninguna razón por la que alguna vez haya escuchado que en este caso querría romper la conexión. Si su aplicación puede restablecer la conexión de forma automática y transparente, entonces no le ofrece ninguna seguridad adicional (de hecho, pierde algo porque cada autenticación expone un poco de información). De hecho, la popular función integrada llamada agrupación de conexiones hace que las conexiones permanezcan abiertas incluso cuando le dice al código que lo cierre para que la conexión pueda ser reutilizada por otro proceso sin la sobrecarga de la autenticación. – MightyE

+0

¿Entonces la conexión se reestablecerá automáticamente cuando la conexión esté * abierta *? ¿O tengo que escribir mi propio código para detectar eso? – Pieter888

0

Sí se puede, siempre y cuando:

  • se volverá a conectar si se pierde la conexión
  • puede restablecer el estado de la conexión si algo extraño sucede
  • Se detectará si la conexión "se queda en silencio" , por ejemplo, si se produce un tiempo de espera del cortafuegos

Básicamente, se requiere una gran atención a los casos de falla y la recuperación correcta; conectar y desconectar a menudo es mucho más fácil.

0

Creo que si hay un mecanismo de agrupación de conexiones, será mejor que cierre la conexión.

Una razón para ello es que no necesita volver a verificar si su conexión aún está activa o no.

Cuestiones relacionadas