【问题标题】:.net + SQL + Timeout issue.net + SQL + 超时问题
【发布时间】:2017-02-18 22:50:40
【问题描述】:

我在连接到 SQL Server 实例的 .net 库时遇到问题。

该库是应用程序的一部分,该应用程序将 edi 文件的内容插入 SQL Server 2008 R2 数据库。

每次调用该库时,它都会抛出一个异常(下面的#1),说明连接已超时。有问题的服务器上有多个其他非 .net 应用程序使用相同的连接字符串并且可以正常工作。

我还在另一台联网机器上安装了包含该库的应用程序,它从那里运行良好。

我尝试过的事情:

设置 .CommandTimeout = 150; - 在 150 秒前超时。
重新安装所有 .net 框架
重新启动应用服务器和数据库服务器
从数据上下文切换到标准数据适配器查询。
使用数据上下文和标准数据适配器查询创建了一个独立的 exe 来测试连接字符串 - 这两种方法第一次都失败,但随后在所有后续尝试中连接并读取数据,直到 exe 重新启动。这导致我在遇到异常时向库添加延迟重试尝试,但这会导致异常 2。

我现在不知所措。任何帮助将不胜感激。

例外 1:

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, SqlConnection owningObject, Boolean withFailover)
   at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject, Boolean withFailover)
   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()
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
   at System.Data.Linq.DataContext.ExecuteQuery[TResult](String query, Object[] parameters)

<Query Execution method call>

例外 2:

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.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()
   at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user)
   at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe()
   at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode()
   at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query)
   at System.Data.Linq.DataContext.ExecuteMethodCall(Object instance, MethodInfo methodInfo, Object[] parameters)
   at System.Data.Linq.DataContext.ExecuteQuery[TResult](String query, Object[] parameters)

<Query Execution method call>

【问题讨论】:

    标签: c# .net sql-server linq timeout


    【解决方案1】:

    设置.CommandTimeout

    当查询无法在指定时间内获得总数据时发生..

    在您的情况下,可能会发生很多超时..我们通过以下步骤解决了我们的情况下的超时方法

    1.将 RemoteLoginTimeout 更改为 60
    2.将RemoteQuery超时时间改为0..

    此外,我们还在所有服务器上禁用了 TCP 烟囱

    https://blogs.msdn.microsoft.com/psssql/2010/02/21/tcp-offloading-again/

    现在我们 100% 确定,网络不是超时的一个因素,即使查询因超时而失败,当通过 SQLagent 或其他东西执行时

    1.我们尝试更新统计数据
    2.我们会看看,如果有机会优化..

    你也可以参考this blog,这里OP提到了所有可能发生的超时

    尝试从 SqlClient 连接池获取连接时
    尝试创建与服务器的新连接时(未从池中获取连接)
    向服务器显式发送命令时
    使用“context connection=true”发送命令时
    当隐式(在幕后)向服务器发送命令时
    执行异步命令时(BeginExecute…)
    等待服务器的注意确认时​​(特殊情况)
    发送 TM 命令时
    获取行时
    使用批量复制上传行时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2017-04-24
      相关资源
      最近更新 更多