Timeout di connessione per SQL server


Risposte:


213

Sì, puoi aggiungere ;Connection Timeout=30alla stringa di connessione e specificare il valore che desideri.

Il valore di timeout impostato nella Connection Timeoutproprietà è un tempo espresso in secondi . Se questa proprietà non è impostata, il valore di timeout per la connessione è il valore predefinito (15 secondi).

Inoltre, impostando il valore di timeout su 0, stai specificando che il tuo tentativo di connessione attende un tempo infinito. Come descritto nella documentazione, questo è qualcosa che non dovresti impostare nella tua stringa di connessione:

Un valore di 0 indica nessun limite e dovrebbe essere evitato in una ConnectionString perché un tentativo di connessione attende indefinitamente.


Puoi fare un esempio per questo? Sto usando EF6 e ho 3 milioni di dati nella mia tabella quando eseguo un programma di elaborazione restituisce un errore di timeout ... nota: sto usando l'indicizzazione nella tabella
saulyasar

4
@saulyasar Questo è il timeout di CONNESSIONE, non il timeout di COMANDO. Il timeout di CONNESSIONE è circa il tempo durante il quale tenterà di connettersi al server SQL. Si desidera esaminare il timeout COMMAND, ovvero il tempo di esecuzione di una procedura o di un'istruzione prima del timeout.
granadaCoder

32

Hmmm ...

Come ha detto Darin, puoi specificare un valore di timeout di connessione più alto, ma dubito che sia davvero il problema.

Quando si verificano timeout di connessione, in genere è un problema con uno dei seguenti:

  1. Configurazione di rete: connessione lenta tra il server Web / dev box e il server SQL. L'aumento del timeout può risolvere questo problema, ma sarebbe saggio indagare sul problema sottostante.

  2. Stringa di connessione. Ho riscontrato problemi in cui un nome utente / password errati, per qualche motivo, restituirà un errore di timeout invece di un errore reale che indica "accesso negato". Questo non dovrebbe accadere, ma la vita è così.

  3. Stringa di connessione 2: se si specifica il nome del server in modo errato o incompleto (ad esempio, mysqlserverinvece di mysqlserver.webdomain.com), verrà visualizzato un timeout. È possibile eseguire il ping del server utilizzando il nome del server esattamente come specificato nella stringa di connessione dalla riga di comando?

  4. Stringa di connessione 3: se il nome del server è nel tuo DNS (o nel file hosts), ma punta a un IP errato o inaccessibile, riceverai un timeout anziché un errore di macchina non trovata.

  5. La query che stai chiamando sta scadendo. Può sembrare che il problema sia la connessione al server, ma, a seconda di come è strutturata la tua app, potresti arrivare allo stadio in cui è in esecuzione la tua query prima che si verifichi il timeout.

  6. Perdite di connessione. Quanti processi sono in esecuzione? Quante connessioni aperte? Non sono sicuro se il raw ADO.NET esegua il pool di connessioni, chiuda automaticamente le connessioni quando necessario come Enterprise Library o dove tutto ciò è configurato. Questa è probabilmente una falsa pista. Tuttavia, lavorando con WCF e servizi Web, ho riscontrato problemi con connessioni non chiuse che causavano timeout e altri comportamenti imprevedibili.

Cose da provare:

  1. Si verifica un timeout quando ci si connette al server con SQL Management Studio? In tal caso, è probabile che il problema sia la configurazione della rete. Se non vedi un problema durante la connessione con Management Studio, il problema sarà nella tua app, non con il server.

  2. Esegui SQL Profiler e guarda cosa sta effettivamente succedendo. Dovresti essere in grado di capire se ti stai davvero connettendo o se il problema è una query.

  3. Esegui la tua query in Management Studio e guarda quanto tempo ci vuole.

In bocca al lupo!


se la tua query è scaduta, immagino che otterrai un timeout di comando
user55474

@ user55474 probabilmente; dipende ( molto raramente) da come viene chiamato.
Salva il

Non secondo questo post del blog msdn
tom redfern

@ hugh credo di aver detto che era raro, ma l'ho visto in prima persona.
3Dave il

1
+1 per "Esegui SQL Profiler". Sembra che sarà complicato, ma in realtà è sufficiente fare clic su "Strumenti> SQL Server Profiler" e osservare cosa dice la tua app a SQL Server. Si scopre che la mia era l'opzione n. 5 :)
Andrew Kvochick

11

Se vuoi cambiarlo dinamicamente, preferisco usare SqlConnectionStringBuilder .

Ti permette di convertire ConnectionString cioè una stringa in oggetto di classe, tutte le proprietà della stringa di connessione diventeranno il suo membro.

In questo caso il vero vantaggio sarebbe che non devi preoccuparti Se la parte della stringa ConnectionTimeout è già presente nella stringa di connessione o no?

Inoltre, poiché crea un oggetto ed è sempre utile assegnare un valore all'oggetto piuttosto che manipolare la stringa.

Ecco il codice di esempio:

var sscsb = new SqlConnectionStringBuilder(_dbFactory.Database.ConnectionString);

sscsb.ConnectTimeout = 30;

var conn = new SqlConnection(sscsb.ConnectionString);

2
Non riesco a credere che la creazione della ConnectionTimeoutproprietà sul SqlConnectiontipo di sola lettura sia stata considerata una buona idea.
Maslow
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.