Condividi tramite


Timeout messaggi scaduti durante la connessione a SQL Server

Si applica a: SQL Server

Note

Prima di iniziare la risoluzione dei problemi, controllare i prerequisiti ed esaminare l'elenco di controllo.

Un errore di timeout indica che una determinata operazione richiede più tempo del necessario. L'applicazione client arresta l'operazione (invece di attendere per un tempo indefinito), che può bloccare altre operazioni e sospendere un'applicazione. Questo articolo fornisce soluzioni per gli errori di "timeout dei comandi" e "timeout della connessione" che si ricevono quando ci si connette a SQL Server.

Verificare gli errori di timeout scaduti

Quando si verificano problemi di timeout scaduti, viene visualizzato uno o più dei messaggi di errore seguenti:

  • Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde.

  • System.Data.SqlClient.SqlException (0x80131904): Timeout connessione scaduto. Il periodo di timeout è scaduto durante il tentativo di utilizzare il riconoscimento dell'handshake di pre-accesso. Ciò potrebbe verificarsi perché l'handshake di pre-accesso ha avuto esito negativo oppure il server non è stato in grado di rispondere in tempo. Il tempo impiegato nel tentativo di connettersi a questo server era [Pre-Login] initialization=23; handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out.

  • System.Data.SqlClient.SqlException (0x80131904): Timeout scaduto. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde. System.ComponentModel.Win32Exception (0x80004005): The wait operation timed out.

  • Il timeout di connessione è scaduto. Il periodo di timeout è scaduto durante il tentativo di utilizzare il riconoscimento dell'handshake di pre-accesso. Ciò potrebbe verificarsi perché l'handshake di pre-accesso ha avuto esito negativo oppure il server non è stato in grado di rispondere in tempo.
    La durata trascorsa durante il tentativo di connessione a questo server era [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Errore: -2).

  • System.InvalidOperationException: timeout scaduto. Il periodo di timeout è scaduto prima di aver ottenuto la connessione dal pool.

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

Note

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

Determinare il tipo di errori di timeout scaduti

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

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

Note

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

Prima della risoluzione dei problemi, visualizzare lo stack di chiamate completo dei messaggi di errore per determinare il tipo 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 del comando:

    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 SqlCommand classe viene usata per lavorare con una query, non con una connessione. Il ExecuteScalar metodo viene usato per eseguire una query. È anche possibile visualizzare altri elementi, ad esempio o ExecuteReader ExecuteNonQuery.

Risolvere gli errori di timeout scaduti

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

  • Se si verifica un errore di timeout della connessione, seguire questa procedura:

    1. Aumentare il parametro connection-timeout.

      • Se si usa un'applicazione per connettersi a SQL Server, aumentare i valori dei parametri di timeout di connessione pertinenti e verificare se la connessione ha esito positivo. Ad esempio, se si usa System.Data.SqlClient, impostare la proprietà SqlConnection.ConnectionTimeout su 30 o su un valore superiore.

        Note

        Se si usano altri provider, selezionare Homepage per la programmazione client SQL.

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

    2. Se la connessione ha esito positivo, si tratta di un problema di rete. Per risolvere il problema, è necessario collaborare con l'amministratore di rete. Dopo la risoluzione, è possibile ripristinare le impostazioni predefinite nell'applicazione.

      Note

      L'aumento del timeout della connessione nell'applicazione è un metodo possibile, ma non è una risoluzione a lungo termine. Ciò è dovuto al fatto che la connessione si verifica rapidamente (in genere entro pochi millisecondi) quando si tenta di connettersi a un'origine dati.

Cause e risoluzioni tipiche per l'errore

Nella tabella seguente sono elencate le cause e le risoluzioni tipiche per gli errori di timeout scaduti. Per altri suggerimenti e suggerimenti, vedere Risoluzione dei problemi: Timeout scaduto.

Cause tipiche Risoluzioni
Il nome del server è stato digitato in modo non corretto. Riprovare con il nome del server corretto.
Il servizio SQL Server nel server non è in esecuzione. Avviare l'istanza del motore di database di SQL Server.
La porta TCP/IP per l'istanza di motore di database è bloccata da un firewall. Configurare il firewall per consentire l'accesso al motore di database.
Il motore di database non è in ascolto sulla porta 1433. Questo perché la porta viene modificata o non è l'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 da connettere con il Sqlcmd -S <ip_addres>,<port> comando . Nel log degli 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 nel server o specificare il numero di porta TCP/IP da connettere.
Il client e il server non sono configurati per l'uso dello stesso protocollo di rete. Assicurarsi che il server e i computer client dispongano di almeno un protocollo abilitato in comune usando Gestione configurazione SQL Server. Ad esempio, se il client si connette usando socket TCP/IP, ma SQL Server è in ascolto solo sulle named pipe, non è possibile stabilire alcuna connettività.
La rete non può risolvere il nome del server in un indirizzo IP. Questa operazione può essere testata usando i programmi ping o telnet. Risolvere il problema di risoluzione dei nomi del computer nella rete o connettersi al server usando l'indirizzo IP. Questo non è un problema di SQL Server. Per assistenza, vedere la documentazione di Windows o contattare l'amministratore di rete. Usare il comando seguente per testare la connettività:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Se l'uso di un indirizzo IP funziona, ma il nome del server non funziona, si tratta di un problema di risoluzione dei nomi.
La rete non può connettersi usando l'indirizzo IP. Questa operazione può essere testata usando il programma ping, telnet o tracert . Risolvere il problema TCP/IP nella rete: questo non è un problema di SQL Server. Per assistenza, vedere la documentazione di Windows o contattare l'amministratore di rete.
Per la risoluzione dei problemi di rete più avanzata, vedere 0300 Problemi di rete intermittenti o periodici.

Vedi anche