2009-01-16 23 views
5

Estoy interesado en saber cómo las bases de datos manejan conexiones que no están explícitamente cerradas por la entidad que inició la conexión.Base de datos y conexiones

  1. Supongamos que tengo una base de datos que puede aceptar solo 2 conexiones simultáneas a la vez. Tengo un código que abre una conexión y nunca la cierra. Este fragmento de código se ejecuta para siempre, pero utiliza la conexión solo una vez en su vida útil, pero el objeto de conexión nunca sale del alcance, por lo que no es basura. Digamos que ejecuto 2 instancias de este código. ¿Significa que hasta que el programa finalice o la conexión agote el tiempo de espera (debido a la inactividad) la base de datos no podrá aceptar más conexiones?

  2. En el escenario anterior, si el objeto de conexión es basura, ¿la conexión finaliza automáticamente o depende del controlador de la base de datos que estoy utilizando o la conexión no finaliza hasta que la cierro de manera explícita?

  3. Si abro una conexión en un código y no cierro la conexión explícitamente, pero el programa termina, ¿cómo recupera la base esa conexión?

Respuesta

4

El protocolo subyacente para las conexiones de bases de datos suele ser TCP/IP. La conexión se puede finalizar de una de varias maneras:

  1. El servidor lo cierra con gracia y recibe un reconocimiento del cliente;
  2. El cliente cierra con gracia y recibe un acuse de recibo del servidor;
  3. Ha finalizado el tiempo de espera de la conexión. Los respectivos sistemas operativos le dicen al cliente y al servidor por separado que la conexión se ha cerrado;
  4. La conexión se cierra a la fuerza por cualquier lado.

En el caso de (3), las conexiones TCP deben mantenerse activas enviando mensajes ficticios de vez en cuando para evitar un tiempo de espera. Su conexión puede expirar debido a que ninguna de las partes está haciendo esto (y para una conexión de base de datos no es algo que normalmente desee hacer).

Es muy posible que, por un tiempo, un lado piense que la conexión está cerrada y el otro lado sigue creyendo que está abierta. Los mensajes se pueden enviar en esos casos (y generalmente se descartan).

Cada conexión ("socket") utiliza un recurso de sistema operativo llamado descriptor de archivo (en el lenguaje UNIX, su sistema operativo puede llamarlo de otra manera), que maneja un recurso de E/S y lo mismo utilizado para un archivo abierto (de nuevo, los sistemas operativos pueden variar).

El límite de conexiones en su base de datos será la más baja de:

  • El límite configurado para el sistema operativo;
  • La máxima cantidad de descriptores de archivo permitidos para ese proceso (menos cualquiera que se use para la actividad de E/S); y
  • (posiblemente) configuraciones del sistema o políticas sobre límites de conexión.

Si la conexión no está basada en TCP (por ejemplo, un socket de sistema de archivos como se usa a menudo con MySQL en sistemas UNIX), los principios son de hecho muy similares.

De todos modos, la moraleja de la historia que se debe sacar de esto es que una conexión de base de datos, independientemente de su forma, implica un recurso del sistema operativo de algún tipo. Su programa ha solicitado directa o indirectamente ese recurso. Si el programa muere, el sistema operativo lo reclamará (tal vez no de forma inmediata sino eventualmente). Si la conexión se recolecta, el recurso se liberará de la misma manera que si se hubiera cerrado a la fuerza.

Es ese recurso externo (y no el código que usa su cliente) que mantiene la conexión abierta y limita los límites.

4

para responder a sus preguntas en orden:

  1. Sí, probablemente. A menos que por "conexiones concurrentes" realmente signifique "consultas concurrentes". Si mantiene abierta la conexión de la base de datos, está abierta.

  2. La recolección de basura puede o no limpiar la conexión. Depende del idioma y del controlador de base de datos utilizado. (La recolección de basura puede limitarse a reclamar memoria, no recursos como conexiones TCP).

  3. Cuando su programa finaliza, generalmente el sistema operativo es responsable de limpiar todos los recursos que utilizó. Esto incluye cerrar conexiones de TCP, etc. Entonces, para la mayoría de los tipos de conexión, se notificará a la base de datos que el otro lado cerró la conexión.

Cuestiones relacionadas