Per anni, ho riscontrato problemi molto strani su tutte le mie applicazioni Web che si collegano a un server SQL.Il pool di connessioni SQL Server non rileva connessioni chiuse?
Il problema è che se qualcosa accade al server del database (riavvio del server o altro problema), l'app web smette di funzionare da quel punto in poi, anche se il server del database è vivo e anche dopo.
Cosa accade è che ogni operazione ADO.NET (ExecuteNonQuery, CreateReader, BeginTransaction, ...) non riesce con un InvalidOperationException: "Operazione non valida La connessione è chiusa". Sembra che una chiamata a SqlConnection.Open() recupera una connessione dal pool di applicazioni che è ... chiuso!
Secondo la documentazione, il pool di connessioni dovrebbe rimuovere automaticamente le connessioni dal pool di connessioni reciso, ma pare una connessione chiusa non è considerata come "mozzata", così la chiamata a SqlConnection.Open() restituisce felicemente un connessione chiusa, supponendo che sia aperta, senza verificare questo.
mia soluzione attuale è quella di verificare lo stato della connessione subito dopo l'apertura è:
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
if (connection.State != ConnectionState.Open)
{
SqlConnection.ClearAllPools();
connection.Open();
}
// ...
}
Questa soluzione sembra funzionare per ora, ma non mi sento comodo fare questo.
Quindi le mie domande sono:
- Perché SqlConnection.Open() ritorno connessioni dal pool di connessioni chiusa?
- La mia soluzione alternativa è valida?
- C'è un modo migliore per gestire questo?
Potrei vivere con "pochi minuti", ma quando viene utilizzata la connessione, ovviamente genera un'eccezione, ma quella connessione "cattiva" rimane disponibile nel pool di connessioni per sempre. Non viene mai rimosso, sebbene ADO.NET abbia generato un'eccezione perché la connessione non era buona. –