2009-11-10 2 views
12

È intelligente mantenere la connessione aperta durante l'intera sessione? Ho creato un'applicazione C# che si collega a un database MySql, il programma legge e scrive su di esso e l'applicazione deve essere in esecuzione circa 10 ore al giorno senza interruzioni.Connessione MySql, posso lasciarla aperta?

Ci sono dei rischi connessi al mantenere la connessione aperta invece di chiamare la funzione close() ogni volta dopo aver prelevato qualcosa dal database e averlo riaperto quando hai bisogno di qualcosa di nuovo?

risposta

8

Rilasciare una connessione aperta per un po 'va bene, a patto che:

  1. non si dispone di così tante connessioni contemporaneamente inattive che ti ha colpito il limite di connessione MySQL;

  2. non lasciarlo aperto per ore senza fare nulla. La connessione MySQL predefinita wait_timeout è di 8 ore; lascia una connessione inattiva per così tanto tempo e quando la userai per la prossima volta otterrai un errore "Il server MySQL è andato via".

+2

Non c'è nulla da guadagnare mantenendo la connessione aperta (supponendo che il provider utilizzi il pool di connessioni). Il connettore ufficiale MySQL Connector/Net utilizza il pool di connessioni per impostazione predefinita. L'OP non menziona il fornitore che stanno effettivamente utilizzando, ma se supporta il pool, utilizzerei una strategia aperta late/close early e consentirò al provider di gestire le connessioni fisiche sottostanti. – LukeH

+0

scusa per l'aggiunta di commenti per il thread precedente. Ho letto http://download.oracle.com/javadb/10.3.3.0/devguide/cdevconcepts89498.html, sembra che finchè la tua applicazione ha più thread/transazioni, è buona pratica assegnare ogni thread ad una connessione distinta . Grazie. –

0

Se l'applicazione utilizza la connessione, non vi è alcun motivo per chiuderla. Se non hai bisogno della connessione dovresti chiuderla. Se dovessi connettere più applicazioni al database, hai un numero fisso di connessioni a quel database. Ecco perché è meglio chiudere quando hai finito e riaprire quando ne hai bisogno.

0

Da un punto di vista della sicurezza, direi il suo meglio per chiuderla dopo una query, solo per essere sicuri che nessun altro programma può iniettare E 'proprie cose in connessione aperta.

Mentre le prestazioni sono ridotte, è chiaramente meglio avere la connessione aperta per tutto il tempo.

La scelta ^^

9

Dal momento che si sta utilizzando ADO.NET, è possibile utilizzare integrato collegamento di ADO.NET pool capacità. In realtà, mi permetta di precisare che: è necessario che utilizzi sempre le funzionalità di pool di connessioni integrate di ADO.NET. In questo modo otterrai il runtime .NET per gestire in modo trasparente le tue connessioni per te in background. Manterrà le connessioni aperte per un po 'anche se le hai chiuse e riutilizzate se apri una nuova connessione. Questa è roba davvero veloce.

Assicurarsi di indicare nella stringa di connessione che si desidera disporre di connessioni in pool in quanto potrebbe non essere il comportamento predefinito.

Hai solo bisogno di creare connessioni a livello locale quando ne avete bisogno, dato che sono convogliati nel Fondo backrgound quindi non c'è overhead nella creazione di una nuova connessione:

using (var connection = SomeMethodThatCreatesAConnectionObject()) 
{ 
    // do your stuff here 
    connection.Close(); // this is not necessary as 
         // Dispose() closes it anyway 
         // but still nice to do. 
} 

Ecco come si suppone per farlo in .NET.

0

No, non vedo alcun motivo per non lasciare aperta una connessione e riutilizzarla: dopotutto, questo è il punto dietro le varie tecnologie di connessione-pool di cui si parla (anche se queste sono generalmente riservate per situazioni multi-thread in cui i lavori funzionano tutti sulla stessa origine dati).

Ma, per espandere sulla risposta da bobince, - solo beacause non si sta chiudendo la connessione, non presumere che qualcos'altro non sarà: la connessione potrebbe timeout, ci potrebbero essere problemi di connessione o cento e uno altri motivi per cui la tua connessione muore. È necessario presumere che la connessione potrebbe non essere presente e aggiungere la logica al codice per questa eccezione.

0

Non è consigliabile, a mio parere, mantenere le connessioni aperte. Un altro aspetto che parla sempre di connessioni di chiusura è la scalabilità. Potrebbe andar bene ora lasciarlo aperto, ma cosa succede se l'app viene utilizzata da due volte il triplo della quantità di utenti. È un dolore al collo tornare indietro e cambiare tutto il codice. (So ​​di averlo fatto :-)

0

Il problema verrà risolto se si utilizza il pool di connessioni nel codice. Non è necessario aprire e chiudere la connessione in modo da risparmiare risorse preziose che vengono utilizzate durante l'apertura di una connessione. È sufficiente restituire la connessione a un pool che, quando richiesto per una connessione, restituisce una connessione inattiva.

Ovviamente sono dell'opinione, ottenere un'istanza della connessione, utilizzarla, eseguire il commit/rollback del lavoro e restituirlo al pool. Non suggerirei di mantenere la connessione aperta per così tanto tempo.

0

Una cosa che non ho visto nelle altre risposte, tuttavia: nel caso in cui siano state preparate istruzioni o tabelle temporanee, potrebbero bloccare le risorse del server fino a quando la connessione non viene chiusa. D'altro canto, può essere utile mantenere la connessione in giro per qualche tempo invece di ricrearli ogni pochi istanti.

0

Pagherete una penalità per le prestazioni se aprite e chiudete costantemente i collegamenti. Potrebbe essere saggio utilizzare il pool di connessioni e un breve wait_timeout se si è preoccupati che troppe copie in esecuzione della tua app manchino troppe connessioni al database.

+0

Questo non è il caso, questa è l'unica applicazione in esecuzione e nient'altro dovrebbe nemmeno tentare di connettersi. – Pieter888

+1

Non c'è motivo per cui io abbia mai sentito parlare di ciò che vorresti per eliminare la connessione in questo caso. Se la tua app può ristabilire automaticamente e in modo trasparente la connessione, non offre alcuna sicurezza aggiuntiva (in effetti ne perdi alcuni perché ogni autenticazione espone un piccolo frammento di informazioni). In effetti, la famosa funzionalità integrata denominata pool di connessioni fa sì che le connessioni rimangano aperte anche quando si dice al codice di chiuderla in modo che la connessione possa essere riutilizzata da un altro processo senza il sovraccarico dell'autenticazione. – MightyE

+0

Quindi la connessione verrà ristabilita automaticamente quando la connessione è * aperta *? O devo scrivere il mio codice per rilevarlo? – Pieter888

0

Sì, è possibile, a condizione che:

  • Avrete ricollegarlo se si perde la connessione
  • È possibile ripristinare lo stato della connessione, se succede qualcosa di strano
  • È in grado di rilevare se la connessione "tace" , ad esempio, se si verifica un timeout del firewall

Fondamentalmente richiede molta attenzione ai casi di guasto e ripristino corretto; connettersi e disconnettersi spesso è molto più facile.

0

Penso che, se esiste un meccanismo di connessione, è meglio chiudere la connessione.

Un motivo è che non è necessario ricontrollare se la connessione è ancora attiva o meno.