Messaggi di timeout scaduto durante la connessione a SQL Server

Si applica a: SQL Server

Nota

Prima di iniziare la risoluzione dei problemi, è consigliabile controllare i prerequisiti e verificare l'elenco di controllo.

Un errore di timeout indica che una determinata operazione richiede più tempo del necessario. L'applicazione client arresta l'operazione (anziché attendere un tempo indefinito) impedendo altre operazioni e sospendendo un'applicazione. Questo articolo fornisce soluzioni per gli errori di "command-timeout" e "connection-timeout" che si ricevono quando ci si connette a SQL Server.

Verificare gli errori di scadenza del timeout

Quando si verifica un problema di "scadenza del timeout", viene visualizzato uno dei messaggi di errore seguenti:

  • Timeout scaduto. È trascorso il periodo di timeout prima del completamento dell'operazione oppure il server non risponde.

  • System.Data.SqlClient.SqlException (0x80131904): timeout di connessione scaduto. Il periodo di timeout è scaduto durante il tentativo di utilizzare il riconoscimento dell'handshake di pre-accesso. Questo problema può essere dovuto al fatto che l'handshake di pre-accesso non è riuscito oppure il server non è riuscito a rispondere nel tempo. La durata del tentativo di connessione a questo server è stata [Pre-Login] inizializzazione=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): Tempo di attesa scaduto.

  • System.Data.SqlClient.SqlException (0x80131904): Timeout scaduto. È trascorso il periodo di timeout prima del completamento dell'operazione oppure il server non risponde. System.ComponentModel.Win32Exception (0x80004005): Tempo di attesa scaduto.

  • Timeout di connessione scaduto. Il periodo di timeout è scaduto durante il tentativo di utilizzare il riconoscimento dell'handshake di pre-accesso. Questo problema può essere dovuto al fatto che l'handshake di pre-accesso non è riuscito oppure il server non è riuscito a rispondere nel tempo.
    La durata del tentativo di connessione a questo server è stata [Pre-Login] inizializzazione=21036; handshake=0; (Microsoft SQL Server, Errore: -2).

  • System.InvalidOperationException: Timeout scaduto. Il periodo di timeout è scaduto prima di ottenere una connessione dal pool.

    Se le connessioni non vengono chiuse correttamente, potrebbero verificarsi errori. Questi errori si verificano perché sono in uso tutte le connessioni in pool e viene raggiunta la dimensione massima del pool. È possibile evitare questi errori se si seguono i passaggi descritti nell'articolo Numero di pool di connessioni esaurito.

Nota

Il secondo e il terzo errore si verificano quando viene installato .NET Framework 4.5 o una versione successiva.

Determinare il tipo di errori di timeout scaduto

Dal punto di vista della connettività, si verificano i problemi di timeout seguenti:

  • Timeout della connessione (15 secondi per impostazione predefinita)
  • Timeout della query o dei comandi (30 secondi per impostazione predefinita)

Nota

I valori predefiniti possono essere impostati tramite codice, stringa di connessione o altri metodi.

Prima di risolvere i problemi, per determinare il tipo di errore è necessario visualizzare lo stack di chiamate completo dei messaggi di errore.

  • Vedere l'esempio seguente di uno stack di chiamate di un timeout di connessione:

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
    at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable)
    at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)  
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    at System.Data.SqlClient.SqlConnection.Open()  
    

    SqlConnection.Open indica che il client sta tentando di aprire una connessione e pertanto non è correlato a una query.

  • Vedere l'esempio seguente di uno stack di chiamate di una query o di un timeout dei comandi:

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
    at System.Data.SqlClient.SqlDataReader.get_MetaData()
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
    at System.Data.SqlClient.SqlCommand.ExecuteScalar()
    

    La classe SqlCommand viene utilizzata per usare una query, non una connessione. Il metodo ExecuteScalar viene utilizzato per eseguire una query. È anche possibile visualizzare altri elementi, ad esempio ExecuteReader o ExecuteNonQuery.

Risolvere gli errori di timeout scaduto

  • Se si verifica un errore di timeout della query o del comando, consultare Risolvere gli errori di timeout delle query.

  • Se si verifica un errore di timeout della connessione, attenersi alla seguente procedura:

    1. Aumentare il parametro connection-timeout.

      • Se per connettersi a SQL Server si utilizza un'applicazione, aumentare i valori del parametro connection-timeout pertinente e verificare se la connessione ha esito positivo. Ad esempio, se si utilizza System.Data.SqlClient, impostare la proprietà SqlConnection.ConnectionTimeout su 30 oppure su un valore superiore.

        Nota

        Se si utilizzano altri provider, consultare Homepage per la programmazione client SQL.

      • Se si utilizza SQL Server Management Studio (SSMS), nella finestra di dialogo Connetti al server, selezionare la scheda Proprietà connessione e impostare le Impostazioni di timeout della connessione su un valore superiore.

    2. Se la connessione va a buon fine, si tratta di un problema di rete. È necessario rivolgersi all'amministratore di rete per risolvere il problema. Una volta risolto il problema, è possibile ripristinare le impostazioni predefinite nell'applicazione.

      Nota

      È possibile aumentare il timeout della connessione nell'applicazione, ma non è una soluzione a lungo termine. Questo perché la connessione avviene rapidamente (di solito in pochi millisecondi) quando si cerca di connettersi a un'origine dati.

Cause e soluzioni tipiche dell'errore

La tabella seguente riporta le cause e le soluzioni tipiche degli errori di timeout scaduto. Per ulteriori suggerimenti e consigli, consultare Risoluzione dei problemi: timeout scaduto.

Cause tipiche Risoluzioni
Il nome del server è stato digitato in modo errato. Riprovare con il nome del server corretto.
Il servizio SQL Server sul server non è in esecuzione. Avviare l'istanza del motore di database SQL Server.
La porta TCP/IP dell'istanza del motore di database è bloccata da un firewall. Configurare il firewall per consentire l'accesso al motore del database.
Il motore del database non è in ascolto sulla porta 1433. Ciò è dovuto al fatto che la porta è stata modificata o che non esiste un'istanza predefinita e il servizio SQL Server Browser non è in esecuzione. Avviare il servizio SQL Server Browser o specificare un numero di porta TCP/IP per la connessione con il comando Sqlcmd -S <ip_addres>,<port>. Nel registro errori, trovare il numero di porta su cui è in ascolto SQL Server.
Il servizio SQL Server Browser è in esecuzione, ma la porta UDP 1434 è bloccata da un firewall. Configurare il firewall per consentire l'accesso alla porta UPD 1434 del server o specificare il numero di porta TCP/IP per la connessione.
Il client e il server non sono configurati per utilizzare lo stesso protocollo di rete. Assicurarsi che il server e i computer client abbiano almeno un protocollo abilitato in comune utilizzando Gestione configurazione SQL Server. Ad esempio, se il client si connette utilizzando i socket TCP/IP, ma SQL Server è in ascolto solo su named pipe, non è possibile stabilire la connettività.
La rete non è in grado di risolvere il nome del server in un indirizzo IP: questo può essere verificato utilizzando i programmi ping o telnet. Risolvere il problema di risoluzione del nome del computer sulla rete o collegarsi al server utilizzando l'indirizzo IP: non si tratta di un problema di SQL Server. Per ulteriore supporto, consultare la documentazione di Windows o contattare l'amministratore di rete. Utilizzare il seguente comando per verificare la connettività:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Se l'utilizzo di un indirizzo IP funziona, ma il nome del server no, si tratta di un problema di risoluzione dei nomi.
La rete non è in grado di connettersi utilizzando l'indirizzo IP: è possibile effettuare una verifica utilizzando i programmi ping, telnet o tracert. Risolvere il problema TCP/IP della rete: non si tratta di un problema di SQL Server. Per ulteriore supporto, consultare la documentazione di Windows o contattare l'amministratore di rete.
Per una risoluzione più avanzata dei problemi di rete, consultare Problema di rete intermittente o periodico 0300.

Vedere anche