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:
- El servidor lo cierra con gracia y recibe un reconocimiento del cliente;
- El cliente cierra con gracia y recibe un acuse de recibo del servidor;
- 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;
- 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.