Domanda

Ricordo di aver sentito che il processo di connessione in mysql è stato progettato per essere molto veloce rispetto ad altri RDBMS e che quindi usando a libreria che fornisce il pool di connessioni (SQLAlchemy) non ti aiuterà molto se abiliti il ??pool di connessioni.

Qualcuno ha qualche esperienza con questo?

Sto diffidando di abilitarlo a causa della possibilità che se un codice fa qualcosa di significativo su una connessione db e (forse per errore) non ripulisce dopo se stesso, quello stato che normalmente verrebbe ripulito alla chiusura della connessione verrà invece propagato al codice successivo che ottiene una connessione riciclata.

È stato utile?

Soluzione

Non è necessario preoccuparsi dello stato residuo su una connessione quando si utilizza il pool di connessioni di SQLA, a meno che l'applicazione non stia modificando le opzioni a livello di connessione come i livelli di isolamento delle transazioni (che generalmente non è il caso). Il pool di connessioni di SQLA emette un connection.rollback () sulla connessione quando viene eseguito il check-in, in modo da eliminare tutti gli stati transazionali o i blocchi.

È possibile che il tempo di connessione di MySQL sia piuttosto veloce, specialmente se si sta effettuando la connessione tramite socket unix sulla stessa macchina. Se usi un pool di connessioni, vuoi anche assicurarti che le connessioni vengano riciclate dopo un certo periodo di tempo poiché la libreria client di MySQL chiuderà automaticamente le connessioni inattive per più di 8 ore (in SQLAlchemy questa è l'opzione pool_recycle).

È possibile eseguire rapidamente il benchmarking del pool di connessioni rispetto a non con un'applicazione SQLA modificando l'implementazione del pool dal valore predefinito di QueuePool a NullPool, che è un'implementazione del pool che in realtà non raggruppa nulla: si connette e si disconnette per reale quando la connessione proxy viene acquisita e successivamente chiusa.

Altri suggerimenti

Anche se la parte di connessione di MySQL stessa è piuttosto liscia, presumibilmente c'è ancora una connessione di rete coinvolta (che sia loopback o fisica). Se stai facendo un lotto di richieste, ciò potrebbe diventare molto costoso. Dipenderà (come spesso accade) esattamente da cosa fa la tua applicazione, ovviamente - se stai facendo molto lavoro per connessione, allora dominerà e non guadagnerai molto.

In caso di dubbio, benchmark - ma mi fiderei in generale che una libreria di pool di connessioni (almeno una rispettabile) dovrebbe funzionare correttamente e ripristinare le cose in modo appropriato.

Risposta breve: è necessario confrontarla.

Risposta lunga: dipende. MySQL è veloce per la configurazione della connessione, quindi evitare che il costo non sia un buon motivo per il pool di connessioni. Il punto in cui vinci è se le query sono poche e veloci perché allora vedrai una vittoria con il pool.

L'altra preoccupazione è come l'applicazione tratta il thread SQL. Se non esegue transazioni SQL e non fa ipotesi sullo stato del thread, il pooling non sarà un problema. OTOH, il codice che si basa sulla chiusura del thread per scartare le tabelle temporanee o per eseguire il rollback delle transazioni avrà molti problemi con il pooling.

Il pool di connessioni accelera le cose in quanto non è necessario creare un oggetto java.sql.Connection ogni volta che si esegue una query del database. Uso il pool di connessioni Tomcat a un database mysql per applicazioni Web che eseguono molte query, durante un carico elevato da parte dell'utente si nota un notevole miglioramento della velocità.

Ho creato un semplice servizio RESTful con Django e l'ho testato con e senza pool di connessioni. Nel mio caso, la differenza era abbastanza evidente.

In una LAN, senza di essa, il tempo di risposta era compreso tra 1 e 5 secondi. Con esso, meno di 20 ms. I risultati possono variare, ma la configurazione che sto usando per MySQL & amp; I server Apache sono piuttosto standard di fascia bassa.

Se stai offrendo pagine dell'interfaccia utente su Internet, il tempo extra potrebbe non essere evidente per l'utente, ma nel mio caso era inaccettabile, quindi ho optato per l'uso del pool. Spero che questo ti aiuti.

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