Perché è una cattiva pratica effettuare più connessioni al database in un'unica richiesta?

StackOverflow https://stackoverflow.com/questions/28590

Domanda

Una discussione sui Singleton in PHP mi fa riflettere sempre di più su questo problema.La maggior parte delle persone consiglia di non effettuare un sacco di connessioni DB in una richiesta e sono solo curioso di sapere quale sia il tuo ragionamento.Il mio primo pensiero è la spesa per il tuo script per fare così tante richieste al DB, ma poi mi ribatto con la domanda:connessioni multiple non renderebbero le query simultanee più efficienti?

Che ne dite di alcune risposte (con prove, gente) da parte di alcune persone informate?

È stato utile?

Soluzione

Le connessioni al database sono una risorsa limitata.Alcuni DB hanno un limite di connessioni molto basso e lo spreco di connessioni è un grosso problema.Consumando molte connessioni, potresti bloccare altri per l'utilizzo del database.

Inoltre, lanciare un sacco di connessioni extra al DB non aiuta a nulla a meno che non ci siano risorse sul server DB inattive.Se hai 8 core e solo uno viene utilizzato per soddisfare una query, allora sicuramente, creare un'altra connessione potrebbe essere d'aiuto.Più probabilmente, però, stai già utilizzando tutti i core disponibili.Probabilmente stai anche colpendo lo stesso disco rigido per ogni richiesta DB e aggiungendo ulteriori contese di blocco.

Se il tuo DB ha qualcosa che assomiglia ad un utilizzo elevato, l'aggiunta di connessioni extra non sarà d'aiuto.Sarebbe come generare thread aggiuntivi in ​​un'applicazione con la cieca speranza che la concorrenza aggiuntiva renda l'elaborazione più veloce.Esso Potrebbe in alcune determinate circostanze, ma in altri casi ti rallenterà semplicemente mentre colpisci il disco rigido, perdi tempo a cambiare attività e introduci un sovraccarico di sincronizzazione.

Altri suggerimenti

È il costo per impostare la connessione, trasferire i dati e poi eliminarli.Divorerà la tua performance.

Le prove sono più difficili da trovare, ma considera quanto segue...

Diciamo che ci vogliono x microsecondi per stabilire una connessione.

Ora vuoi effettuare diverse richieste e ottenere dati avanti e indietro.Diciamo che la differenza nel tempo di trasporto è trascurabile tra una connessione e molte (solo per amor di discussione).

Ora diciamo che ci vogliono y microsecondi per chiudere la connessione.

L'apertura di una connessione richiederà x+y microsecondi di sovraccarico.Per aprirne molti occorrerà n * (x+y).Ciò ritarderà la tua esecuzione.

Configurare una connessione DB è solitamente piuttosto impegnativo.Stanno accadendo molte cose dietro le quinte (Risoluzione DNS/connessione TCP/Handshake/Autenticazione/Query effettiva).

Una volta ho avuto un problema con una strana configurazione DNS che faceva sì che ogni connessione TCP impiegasse alcuni secondi prima di attivarsi.La mia procedura di accesso (a causa di un'architettura complessa) ha richiesto il completamento di 3 diverse connessioni DB.Con quel problema, ci voleva un'eternità per accedere.Abbiamo quindi rifattorizzato il codice per farlo passare attraverso una sola connessione.

Accediamo a Informix da .NET e utilizziamo più connessioni.A meno che non si avvii una transazione su ciascuna connessione, spesso viene gestita nel pool di connessioni.So che è molto specifico del marchio, ma l'accesso client alla maggior parte (?) dei sistemi di database metterà in comune le connessioni al meglio delle sue capacità.

Per inciso, abbiamo riscontrato un problema con il conteggio delle connessioni a causa delle connessioni tra database.Informix supporta i sinonimi, quindi abbiamo creato sinonimi per i trasgressori comuni e le connessioni multiple sono state gestite lato server, risparmiando molto in termini di tempo di trasferimento, sovraccarico di creazione della connessione e costi di licenza (il vero punto cruciale della nostra situazione).

Presumo che ciò sia dovuto al fatto che le tue richieste non vengono inviate in modo asincrono, poiché le tue richieste vengono eseguite in modo iterativo sul server, bloccandosi ogni volta, devi pagare il sovraccarico della creazione di una connessione ogni volta, quando devi solo farlo una volta...

In Flex, tutte le chiamate ai servizi Web vengono chiamate automaticamente in modo asincrono, quindi è comune vedere più connessioni o richieste in coda sulla stessa connessione.

Le richieste asincrone mitigano i costi di connessione attraverso tempi di richiesta/risposta più rapidi... perché non è possibile facilmente Se si ottiene questo risultato in PHP senza alcun threading, l'impatto in termini di prestazioni è maggiore rispetto al semplice riutilizzo della stessa connessione.

sono i miei 2 centesimi...

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