Domanda

Sono interessato a sapere come i database gestiscono le connessioni che non sono esplicitamente chiuse dall'entità che ha avviato la connessione.

  1. Supponiamo di avere un database in grado di accettare solo 2 connessioni simultanee alla volta. Ho un pezzo di codice che apre una connessione e non la chiude mai. Questo pezzo di codice viene eseguito per sempre, ma utilizza la connessione solo una volta nella sua vita, ma l'oggetto di connessione non esce mai dall'ambito, quindi non viene raccolto in modo inutile. Supponiamo di eseguire 2 istanze di questo codice. Significa che fino al termine del programma o al timeout della connessione (a causa di inattività) il database non può accettare più connessioni?

  2. Nello scenario di cui sopra se l'oggetto connessione viene garbage collection, la connessione viene terminata automaticamente o dipende dal driver del database che sto usando o la connessione non viene terminata fino a quando non la chiudo esplicitamente?

  3. Se apro una connessione in codice e non chiudo esplicitamente la connessione, ma il programma termina, come fa il database a recuperare tale connessione?

È stato utile?

Soluzione

Il protocollo sottostante per le connessioni al database è in genere basato su TCP / IP. La connessione può essere terminata in diversi modi:

  1. Il server lo chiude con garbo e riceve un riconoscimento dal client;
  2. Il client si chiude con garbo e riceve un riconoscimento dal server;
  3. Timeout della connessione. Sia il client che il server separatamente sono informati dai rispettivi sistemi operativi che la connessione è stata chiusa;
  4. La connessione è stata forzatamente chiusa da entrambi i lati.

Nel caso di (3), le connessioni TCP devono essere mantenute attive inviando messaggi fittizi ogni tanto per evitare un timeout. La tua connessione potrebbe andare in timeout perché nessuna delle due parti lo fa (e per una connessione al database non è qualcosa che in genere vuoi fare).

È del tutto possibile per un tempo che una parte pensi che la connessione sia chiusa e l'altra parte a credere ancora che sia aperta. I messaggi possono essere inviati in questi casi (e generalmente scartati).

Ogni connessione (" socket ") utilizza una risorsa del sistema operativo chiamata descrittore di file (in linguaggio UNIX, il tuo sistema operativo potrebbe chiamarla qualcos'altro), che è un handle per un I / O risorsa e la stessa cosa utilizzata per un file aperto (di nuovo, i sistemi operativi possono variare).

Il limite per le connessioni sul database sarà il più basso di:

  • Il limite configurato per il sistema operativo;
  • I descrittori di file massimi consentiti per quel processo (meno qualsiasi utilizzato per l'attività di I / O); e
  • (possibilmente) impostazioni di sistema o criteri sui limiti di connessione.

Se la connessione non è basata su TCP (ad es. un socket per filesystem come viene spesso utilizzato con MySQL su sistemi UNIX) i principi sono in effetti molto semplici.

Ad ogni modo, la morale della storia che ne deriva è che una connessione al database - indipendentemente dalla sua forma - implica una risorsa del sistema operativo di qualche tipo. Il tuo programma ha richiesto direttamente o indirettamente quella risorsa. Se il programma muore, il sistema operativo lo recupererà (forse non immediatamente ma alla fine). Se la connessione ottiene la spazzatura raccolta, la risorsa verrà rilasciata più o meno come se fosse stata forzatamente chiusa.

È quella risorsa esterna (e non il codice utilizzato dal tuo client) che mantiene aperta la connessione e determina eventuali limiti.

Altri suggerimenti

Per rispondere alle tue domande in ordine:

  1. Sì, probabilmente. A meno che non sia indicato da "connessioni simultanee" intendi effettivamente "domande simultanee". Se stai tenendo aperta la connessione al database, è aperta.

  2. La garbage collection può o meno ripulire la connessione. Dipende dalla lingua e dal driver del database utilizzati. (La garbage collection può essere limitata al recupero della memoria, non a risorse come le connessioni TCP.)

  3. Al termine del programma, in genere il sistema operativo è responsabile della pulizia di tutte le risorse utilizzate. Ciò include la chiusura di connessioni TCP, ecc. Pertanto, per la maggior parte dei tipi di connessione, al database verrà notificato che l'altra parte ha chiuso la connessione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top