Dela via


Tidsgräns för utgångna meddelanden vid anslutning till SQL Server

Gäller för: SQL Server

Kommentar

Innan du börjar felsöka kontrollerar du kraven och går igenom checklistan.

Ett timeoutfel innebär att en viss åtgärd tar längre tid än nödvändigt. Klientprogrammet stoppar åtgärden (i stället för att vänta på obestämd tid), vilket kan blockera andra åtgärder och pausa ett program. Den här artikeln innehåller lösningar för "kommando-timeout" och "timeout-fel för anslutning" som du får när du ansluter till SQL Server.

Kontrollera att tidsgränsen har upphört att gälla

När du får problem med "tidsgränsen har upphört att gälla" får du ett eller flera av följande felmeddelanden:

  • Tidsgränsen har överskridits. Tidsgränsöverskridning uppstod innan åtgärden slutfördes eller servern svarar inte.

  • System.Data.SqlClient.SqlException (0x80131904): Tidsgränsen för anslutningen har upphört att gälla. Tidsgränsen passerades när handskakningen före inloggningen skulle genomföras. Detta kan bero på att handskakningen misslyckades eller på att servern inte kunde svara i tid. Tidsåtgången för att försöka ansluta till servern var: [före inloggning] initiering=23; handskakning=14979;
    System.ComponentModel.Win32Exception (0x80004005): Tidsgränsen för vänteåtgärden överskreds.

  • System.Data.SqlClient.SqlException (0x80131904): Tidsgränsen har upphört att gälla. Tidsgränsöverskridning uppstod innan åtgärden slutfördes eller servern svarar inte. System.ComponentModel.Win32Exception (0x80004005): Tidsgränsen för vänteåtgärden överskreds.

  • Tidsgränsen för anslutning överskreds. Tidsgränsen passerades när handskakningen före inloggningen skulle genomföras. Detta kan bero på att handskakningen misslyckades eller på att servern inte kunde svara i tid.
    Varaktigheten för att försöka ansluta till den här servern var [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Fel: -2).

  • System.InvalidOperationException: Tidsgränsen har upphört att gälla. Tidsgränsperioden gick ut innan du fick en anslutning från poolen.

    Om anslutningarna inte stängs korrekt kan fel uppstå. Dessa fel uppstår eftersom alla poolanslutningar används och maximal poolstorlek uppnås. Du kan undvika dessa fel om du följer stegen som beskrivs i artikeln om uttömd anslutningspool .

Kommentar

Det andra och det tredje felet uppstår när .NET Framework 4.5 eller en senare version installeras.

Fastställa vilken typ av timeoutfel som har upphört att gälla

Ur ett anslutningsperspektiv uppstår följande timeout-problem:

  • Tidsgräns för anslutning (15 sekunder som standard)
  • Tidsgräns för frågor eller kommandon (30 sekunder som standard)

Kommentar

Standardvärdena kan anges via kod, anslutningssträng eller andra metoder.

Innan du felsöker kan du visa den fullständiga anropsstacken för felmeddelandena för att fastställa feltypen.

  • Se följande exempel på en anropsstack med en tidsgräns för anslutning:

    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 anger att klienten försöker öppna en anslutning och därför inte är relaterad till en fråga.

  • Se följande exempel på en anropsstack för en fråga eller en tidsgräns för kommandon:

    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()
    

    Klassen SqlCommand används för att arbeta med en fråga, inte en anslutning. Metoden ExecuteScalar används för att köra en fråga. Du kan också se andra objekt, till exempel en ExecuteReader eller ExecuteNonQuery.

Felsöka timeoutfel

  • Om du stöter på ett fråge- eller kommando-timeout-fel kan du läsa Felsöka tidsgränsfel för frågor.

  • Om du stöter på ett timeout-fel för anslutningen följer du stegen:

    1. Öka parametern connection-timeout.

      • Om du använder ett program för att ansluta till SQL Server ökar du relevanta parametervärden för anslutningstimeout och kontrollerar om anslutningen lyckas. Om du till exempel använder System.Data.SqlClientanger du egenskapen SqlConnection.ConnectionTimeout till 30 eller ett högre värde.

        Kommentar

        Om du använder andra leverantörer kontrollerar du Startsidan för SQL-klientprogrammering.

      • Om du använder SQL Server Management Studio (SSMS) väljer du fliken Anslutningsegenskaper i dialogrutan Anslut till server och anger timeout-inställningen för anslutning till ett högre värde.

    2. Om anslutningen lyckas är det ett nätverksproblem. Du måste arbeta med nätverksadministratören för att lösa problemet. När det har lösts kan du återgå till standardinställningarna i ditt program.

      Kommentar

      Att öka tidsgränsen för anslutningen i programmet är en möjlig metod, men det är inte en långsiktig lösning. Det beror på att anslutningen sker snabbt (vanligtvis inom några millisekunder) när du försöker ansluta till en datakälla.

Vanliga orsaker och lösningar för felet

I följande tabell visas vanliga orsaker och lösningar för tidsgränsfel. Fler tips och förslag finns i Felsökning: Tidsgränsen har upphört att gälla.

Vanliga orsaker Lösningar
Servernamnet har skrivits felaktigt. Försök igen med rätt servernamn.
SQL Server-tjänsten på servern körs inte. Starta instansen av SQL Server Database Engine.
TCP/IP-porten för databasmotorinstansen blockeras av en brandvägg. Konfigurera brandväggen för att tillåta åtkomst till databasmotorn.
Databasmotorn lyssnar inte på port 1433. Det beror på att porten har ändrats eller att den inte är standardinstansen och att SQL Server Browser-tjänsten inte körs. Starta SQL Server Browser-tjänsten eller ange ett TCP/IP-portnummer för att ansluta med Sqlcmd -S <ip_addres>,<port> kommandot. Leta reda på portnumret som SQL Server lyssnar på i felloggen.
SQL Server Browser-tjänsten körs men UDP-port 1434 blockeras av en brandvägg. Konfigurera brandväggen för att tillåta åtkomst till UPD-port 1434 på servern eller ange TCP/IP-portnumret som ska anslutas.
Klienten och servern är inte konfigurerade för att använda samma nätverksprotokoll. Kontrollera att server- och klientdatorerna har minst ett aktiverat protokoll gemensamt med hjälp av Konfigurationshanteraren för SQL Server. Om klienten till exempel ansluter med hjälp av TCP/IP-socketar, men SQL Server bara lyssnar på namngivna pipes, kan ingen anslutning upprättas.
Nätverket kan inte matcha servernamnet till en IP-adress – detta kan testas med hjälp av ping- eller telnet-programmen. Åtgärda problemet med datorns namnmatchning i nätverket eller anslut till servern med hjälp av IP-adressen – det här är inte ett SQL Server-problem. Om du vill ha hjälp kan du läsa windowsdokumentationen eller kontakta nätverksadministratören. Använd följande kommando för att testa anslutningen:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
Om det fungerar att använda en IP-adress, men servernamnet inte fungerar, är det ett problem med namnmatchning.
Nätverket kan inte ansluta med hjälp av IP-adressen – detta kan testas med hjälp av ping-, telnet- eller tracert-programmet . Åtgärda TCP/IP-problemet i nätverket – det här är inte ett SQL Server-problem. Om du vill ha hjälp kan du läsa windowsdokumentationen eller kontakta nätverksadministratören.
Mer avancerad nätverksfelsökning finns i 0300 – tillfälligt eller periodiskt nätverksproblem.

Se även