2009-07-20 10 views
14

Ho un numero di siti Web ASP.Net (.Net v3.5) in esecuzione su un server con un back-end del database SQL 2000. Per diversi mesi, ho ricevuto InvalidOperationExceptions apparentemente casuale con il messaggio "Errore fatale connessione interna". A volte ci sono alcuni giorni in mezzo, mentre altre volte ci sono più errori al giorno.Cause "Errori irreversibili della connessione interna"

L'eccezione non è limitata a un sito in particolare, sebbene condividano gli assiemi di accesso ai dati aziendali e di dati. L'errore sembra essere sempre generato da SqlClient.TdsParser.Run(). Talvolta viene generato dalle chiamate SqlCommand.Execute() dirette della vecchia scuola, mentre altre volte viene generato dal codice Linq2Sql.

I network mi hanno assicurato che non ci sono errori o pacchetti persi. Qualcun altro ha sperimentato questo? Potrebbe essere un problema con il guidatore? Non siamo ancora riusciti a individuare un trigger specifico per questa eccezione.

Siamo in esecuzione II6 in Windows Server 2003.

risposta

21

Dopo alcuni mesi di ignorare questo problema, ha iniziato a raggiungere una massa critica man mano che il traffico aumentava gradualmente. Sotto un carico pesante, inclusi alcuni crawler, le cose si sono messe in crisi e questi errori si sono riversati senza sosta.

Attraverso tentativi ed errori, abbiamo rintracciato una manciata di query SqlCommand o LINQ il cui SqlConnection non è stato chiuso immediatamente dopo l'uso. Invece, attraverso una programmazione sciatta originata da un fraintendimento delle connessioni LINQ, gli oggetti DataContext erano disposti (e le connessioni chiuse) solo alla fine di una richiesta anziché immediatamente.

Dopo aver refactorizzato questi metodi per chiudere immediatamente la connessione con un C# "utilizzando" il blocco (liberando quel pool per la richiesta successiva), non abbiamo ricevuto più errori. Sebbene non si conosca ancora la ragione sottostante alla quale un pool di connessioni si confonderebbe, siamo stati in grado di interrompere tutti gli errori di questo tipo. Questo problema è stato risolto in combinazione con un altro errore simile che ho postato, trovato qui: Why is my SqlCommand returning a string when it should be an int?

1

Controllare la cartella registro del server (\ Programmi \ Microsoft SQL Server \ MSSQL.1 \ MSSQL \ LOG o simili) i file denominati SqlDump * .mdmp e SqlDump * .txt. Se ne trovi qualcuno dovrai portarlo all'assistenza prodotti.

1

Sembra che la connessione al database venga interrotta o scaduta.

Recentemente abbiamo riscontrato problemi simili spostandosi su IIS 6 da IIS 5 che si collega a SQL 2000. Il problema è stato risolto aumentando il numero di porte effimere disponibili.

Verificare l'utilizzo delle porte temporanee da parte del server IIS. Il numero max predefinito di porte disponibili è normalmente 4000. Potresti considerare di aumentare questo valore se i siti sul tuo server sono particolarmente occupati o se l'applicazione sta effettuando molte chiamate al database.

È possibile monitorarli prima per verificare se superano il limite massimo.

Cerca nella Microsoft Knowledge base "MaxUserPort" e "TcpTimedWaitDelay" e apporta le modifiche necessarie al registro. Assicurati di eseguire il backup del registro o del server snapshot prima di apportare le modifiche. Sarà necessario riavviare per rendere effettive le modifiche.

Si consiglia di verificare che il database e la connessione del recordset vengano chiusi dopo l'uso. La mancata chiusura consumerà inutilmente questo intervallo di porte.

Verificare comunque l'efficienza delle stored procedure poiché potrebbero richiedere più tempo del necessario.

"Se si aprono e si chiudono rapidamente 4000 socket in meno di quattro minuti, si raggiungeranno le impostazioni massime predefinite per le porte anonimi del client ei nuovi tentativi di connessione socket falliranno finché non verrà esaurito il set esistente di socket TIME_WAIT." - da http://support.microsoft.com/kb/328476