Question

J'aimerais savoir comment les bases de données traitent les connexions qui ne sont pas explicitement fermées par l'entité qui a initié la connexion.

  1. Disons que ma base de données ne peut accepter que 2 connexions simultanées à la fois. J'ai un morceau de code qui ouvre une connexion et ne la ferme jamais. Ce morceau de code fonctionne à l'infini, mais il utilise la connexion une seule fois dans sa durée de vie, mais l'objet de connexion ne sort jamais de sa portée. Il n'est donc pas récupéré. Disons que je lance 2 instances de ce code. Est-ce que cela signifie que tant que le programme n'est pas terminé ou que la connexion n'a pas expiré (en raison d'une inactivité), la base de données ne peut plus accepter de connexions?

  2. Dans le scénario ci-dessus, si l'objet de la connexion est récupéré, la connexion est-elle automatiquement terminée ou dépend-elle du pilote de base de données que j'utilise ou la connexion n'est-elle pas terminée jusqu'à ce que je la ferme explicitement?

  3. Si j'ouvre une connexion dans un morceau de code et que je ne ferme pas la connexion explicitement, mais que le programme se termine, comment la base de données récupère-t-elle cette connexion?

Était-ce utile?

La solution

Le protocole sous-jacent pour les connexions à la base de données est généralement basé sur TCP / IP. La connexion peut être interrompue de plusieurs manières:

  1. Le serveur le ferme normalement et reçoit un accusé de réception du client;
  2. Le client se ferme normalement et reçoit un accusé de réception du serveur;
  3. La connexion a expiré. Le client et le serveur sont informés séparément par leurs systèmes d'exploitation respectifs que la connexion a été fermée;
  4. La connexion est fermée de manière forcée par l'un ou l'autre côté.

Dans le cas de (3), les connexions TCP doivent être conservées en envoyant des messages factices de temps en temps pour éviter un délai d'attente. Votre connexion peut expirer car aucune des deux parties ne le fait (et pour une connexion à une base de données, ce n'est généralement pas quelque chose que vous souhaitez faire).

Il est tout à fait possible qu’un côté pense que la connexion est fermée et que l’autre côté croit encore qu’elle est ouverte. Des messages peuvent être envoyés dans ces cas (et généralement rejetés).

Chaque connexion ("socket") utilise une ressource du système d'exploitation appelée descripteur de fichier (dans le langage UNIX, votre système d'exploitation peut l'appeler autrement), qui est un descripteur de périphérique d'entrée / sortie. et la même chose utilisée pour un fichier ouvert (là encore, les systèmes d’exploitation peuvent varier).

La limite de connexions sur votre base de données sera la plus basse des valeurs suivantes:

  • La limite configurée pour le système d'exploitation;
  • Le nombre maximal de descripteurs de fichier autorisés pour ce processus (moins toute activité utilisée pour l'activité d'E / S); et
  • (éventuellement) paramètres système ou règles relatives aux limites de connexion.

Si la connexion n'est pas basée sur TCP (par exemple, un socket de système de fichiers, comme cela est souvent utilisé avec MySQL sur les systèmes UNIX), les principes sont en réalité très simples.

Quoi qu’il en soit, la morale de l’histoire à retenir est qu’une connexion à une base de données, quelle que soit sa forme, implique une ressource du système d’exploitation. Votre programme a directement ou indirectement demandé cette ressource. Si le programme meurt, le système d'exploitation le récupérera (peut-être pas immédiatement mais éventuellement). Si la connexion est nettoyée, la ressource sera libérée de la même manière que si elle avait été fermée de force.

C'est cette ressource externe (et non le code utilisé par votre client) qui maintient la connexion ouverte et limite les restrictions.

Autres conseils

Pour répondre à vos questions dans l'ordre:

  1. Oui, probablement. Sauf si vous utilisez " connexions simultanées " vous voulez dire "requêtes concurrentes". Si vous maintenez ouverte la connexion à la base de données, elle est ouverte.

  2. La récupération de place peut ou non nettoyer la connexion. Dépend de la langue et du pilote de base de données utilisé. (La récupération de place peut être limitée à la récupération de mémoire, pas à des ressources telles que les connexions TCP.)

  3. Lorsque votre programme se termine, le système d'exploitation est généralement responsable du nettoyage de toutes les ressources qu'il a utilisées. Cela inclut la fermeture des connexions TCP, etc. Ainsi, pour la plupart des types de connexion, la base de données sera avertie que l'autre côté a fermé la connexion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top