Utilizzo di connessioni locali anziché globali

1

Nelle ultime settimane sono diventato molto preoccupato che il modo in cui ho lavorato con le connessioni di database negli ultimi anni sia semplicemente sbagliato.

Creo esclusivamente una nuova connessione per ogni operazione di database che devo eseguire. solo nei programmi più complessi, avrei raggruppato diverse attività (comandi Sql) in background e quindi ogni pochi secondi avrei creato una nuova connessione singola, ed eseguirle con la stessa connessione.

Ecco un esempio tipico:

     SqlConnection connection = new SqlConnection(con);
            SqlCommand command = new SqlCommand(@"
            DECLARE @Pk TABLE (Id int)
            INSERT INTO Petrol.Reports(
            [TimeStamp])
            OUTPUT INSERTED.Id INTO @Pk
            VALUES(
            @TimeStamp)

            SELECT Id FROM @Pk", connection);
            command.CommandType = CommandType.Text;

            SqlParameter parameter = command.Parameters.Add("@TimeStamp", SqlDbType.DateTime);
            parameter.Value = this.TimeStamp;

            using (connection)
            {
                connection.Open();
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        this.Id = reader.GetInt32(0);
                        Ref.Petrol_ReportsById[Id] = this;
                    }
                }
            }

Recentemente ho iniziato a lavorare con PostgreSQL e sono stato caricato per vedere che crea un nuovo processo per quasi tutte le connessioni che creo.

L'accordo è che la maggior parte dei campioni di codice in giro usano un approccio molto simile, ma temo che questo sia solo per mantenere le cose semplici.

Considero che sto scrivendo il mio strumento di generazione di oggetti per condividere una singola connessione tra tutte le operazioni (tenendo presente la sicurezza dei thread), sarebbe un approccio corretto secondo te?

    
posta Slime recipe 29.10.2015 - 06:36
fonte

2 risposte

3

Dovresti, anche se è probabile che sia già stato fatto per te

Nelle operazioni di database, gran parte del costo associato all'operazione è la configurazione della connessione, l'autenticazione corretta e così via. Ha molto senso non avere una nuova connessione per ogni operazione, ma semplicemente riutilizzare le connessioni esistenti. Questo è un pattern chiamato pooling di connessioni .

La cosa con il pooling delle connessioni è che è un così grande miglioramento che molte volte il linguaggio con cui stai lavorando lo farà implicitamente. Spesso dovrai dire esplicitamente al codice in qualche modo che NON vuoi usare il pool di connessioni. Nel tuo codice, la chiamata a close sulla connessione non chiuderà la connessione a meno che non si configuri specificamente la stringa di connessione in questo modo. Sarà semplicemente restituirlo al pool, rendendolo nuovamente disponibile per l'uso.

Con questo in mente il tuo schema di utilizzo della connessione è molto buono: ottieni una connessione (che verrà creata se nessuna è disponibile, o semplicemente una connessione riutilizzata esistente), usala per il minor tempo possibile ne hai bisogno per eseguire le tue azioni e poi rilasciarlo (per essere distrutto dopo un certo periodo di tempo o riutilizzato per altre azioni).

    
risposta data 29.10.2015 - 13:30
fonte
1

I consider re writing my objects generating tool to share a single connection between all operations

Il tuo codice attuale funziona, e se funziona abbastanza veloce, perché vuoi riparare qualcosa che non è rotto?

Solo se alcuni dei tuoi codici hanno problemi di prestazioni notevoli o misurabili, e sai che aprire e chiudere le connessioni troppo spesso è la causa, dovresti considerare di riscriverlo nel modo descritto. Non ottimizzarlo solo per ottimizzare.

    
risposta data 29.10.2015 - 23:43
fonte

Leggi altre domande sui tag