Pregunta

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

  1. Digamos 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 código se ejecuta para siempre, pero usa la conexión solo una vez en su vida útil, pero el objeto de conexión nunca sale del alcance, por lo que no se recolecta basura. Digamos que ejecuto 2 instancias de este código. ¿Significa que hasta que finalice el programa o la conexión se agote (debido a la inactividad) la base de datos no puede aceptar más conexiones?

  2. En el escenario anterior, si el objeto de conexión es basura recolectada, ¿la conexión finaliza automáticamente o depende del controlador de la base de datos que estoy usando o la conexión no finaliza en absoluto hasta que la cierre explícitamente?

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

¿Fue útil?

Solución

El protocolo subyacente para las conexiones de la base de datos generalmente se basa en TCP / IP. La conexión se puede terminar de una de varias maneras:

  1. El servidor lo cierra con gracia y recibe un acuse de recibo del cliente;
  2. El cliente cierra con gracia y recibe un acuse de recibo del servidor;
  3. La conexión agota el tiempo de espera. El cliente y el servidor, por separado, son informados por sus respectivos sistemas operativos de que la conexión se ha cerrado;
  4. La conexión se cierra a la fuerza por ambos lados.

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

Es completamente posible que un lado piense que la conexión está cerrada y que el otro lado todavía crea que está abierta. Los mensajes pueden enviarse en esos casos (y generalmente se descartan).

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

El límite de conexiones en su base de datos será el más bajo de:

  • El límite configurado para el sistema operativo;
  • Los descriptores de archivo máximos permitidos para ese proceso (menos los que se utilizan 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 a partir 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 pedido directa o indirectamente ese recurso. Si el programa muere, el sistema operativo lo reclamará (tal vez no de inmediato, pero eventualmente). Si la conexión obtiene basura recolectada, el recurso se liberará de la misma manera que si se hubiera cerrado por la fuerza.

Es ese recurso externo (y no el código que está usando su cliente) que mantiene la conexión abierta y controla cualquier límite.

Otros consejos

Para responder sus preguntas en orden:

  1. Sí, probablemente. A menos que mediante "conexiones concurrentes" en realidad te refieres a "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 recuperar memoria, no a 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 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top