Domanda

Attualmente sto creando un portale Web con ASP.NET che si basa fortemente sull'utilizzo del database. Fondamentalmente, ogni (ben quasi ogni: P) GET query da qualsiasi utente si tradurrà in una query al database dal server web.

Ora, sono davvero nuovo in questo, e sono molto preoccupato per le prestazioni. A causa della mia mancanza di esperienza in questo settore, non so davvero cosa aspettarmi.

La mia domanda è, usando ADO.NET, sarebbe una scelta più intelligente lasciare una connessione statica aperta dal server web al database, e quindi verificare l'integrità di questa connessione lato server prima di ogni query al database? - Oppure, sarebbe meglio aprire la connessione prima di ogni query e poi chiuderla in seguito?

Nella mia testa la prima opzione sarebbe la migliore quando si risparmia tempo di handshaking ecc. prima di ogni query e si risparmia memoria sia sul lato database che sul lato server poiché si dispone di una sola connessione, ma ci sono dei difetti in questo approccio ? È possibile che 2 query inviate allo stesso tempo possano potenzialmente distruggere l'un l'altro integrità o mescolare il set di dati restituito?

Ho provato a cercare ovunque qui e sul Web per trovare alcune best practice a riguardo, ma senza fortuna. Il più vicino è stato questo: è sicuro mantieni le connessioni al database aperte per molto tempo , ma questo sembra essere più adatto per i sistemi distribuiti in cui hai più di un utente del database, mentre ho solo il mio server web ..

È stato utile?

Soluzione

Sei molto presto preoccupato per le prestazioni.

Comunque, le connessioni sono raggruppate dal framework. Dovresti aprirli, usarli e smaltirli al più presto.

Qualcosa come ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

Altri suggerimenti

È meglio lasciare che ADO.NET gestisca il pool di connessioni. Persiste la connessione se lo ritiene necessario, ma non utilizza un oggetto di connessione statica. Questo ha solo un odore. Sarebbe meglio passare l'oggetto connessione ai metodi che ne hanno bisogno e creare la connessione in un blocco utilizzando .

Devi sempre chiudere la connessione dopo aver terminato l'interazione con il DB. ADO.NET ha un pool di connessioni che si occuperà del riutilizzo efficiente della connessione. Ogni volta che si aprono le connessioni 2nd, 3rd e successive, verranno prese da un pool quasi senza spese generali.

Spero che questo aiuti.

Penserei più alla memorizzazione nella cache che al pool di connessioni avanzato. Ogni get richiede un hit nel database?

Se si tratta di un portale, hai contenuti comuni e contenuti specifici dell'utente, utilizzando la cache puoi archiviare elementi comuni e con una chiave alterata (con l'id utente) puoi archiviare elementi specifici dell'utente.

ADO.NET esegue il pool di connessioni. Quando si chiama close sull'oggetto connessione, manterrà la connessione nel pool rendendo la connessione successiva molto più veloce.

L'intuizione iniziale è corretta. Ciò di cui hai bisogno è pooling di connessioni al database.

Sicuramente non si desidera aprire una connessione per ogni chiamata al database, il che si tradurrà in prestazioni estremamente scadenti molto rapidamente. La creazione di una connessione al database è molto costosa.

Invece quello che dovresti usare è un pool di connessioni. Il pool gestirà le connessioni e proverà a riutilizzare le connessioni esistenti quando possibile.

Non conosco la tua piattaforma, ma guardo a Pool di connessioni - ci deve essere una libreria o utility disponibile (nel sistema di base o come componente aggiuntivo o fornita con i driver del database) che fornirà i mezzi raggruppare diverse connessioni attive al database, che sono pronte e raramente utilizzabili quando ne ottieni una dal pool.

Ad essere sincero, mi aspetto che il pooling avvenga per impostazione predefinita in qualsiasi libreria di astrazione del database (con un'opzione disponibile per disabilitarlo). Sembra che ADO.NET faccia questo.

Davvero la prima domanda da porsi è perché sei molto preoccupato per le prestazioni? Qual è il tuo carico di lavoro previsto? Lo hai già provato?

Ma in generale, sì, è più intelligente avere una connessione aperta che tieni in giro per un po 'che riaprire una connessione al database ogni volta; a seconda del tipo di connessione, dei problemi di rete e della fase lunare, può essere necessaria una buona parte di un secondo o più per stabilire una connessione iniziale; se il tuo carico di lavoro è tale che ti aspetti più di un GET ogni cinque secondi circa, sarai più felice con una connessione permanente.

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