【问题标题】:"Timeout" and "A transport-level error" exception during multiple simple queries多个简单查询期间出现“超时”和“传输级错误”异常
【发布时间】:2016-08-31 14:23:27
【问题描述】:

我有一个控制台应用程序,可以将数据从一个数据库移动到另一个数据库。应用程序读取数据、更新数据并写入另一个数据库。查询非常简单,并且在出现错误时会记录下来。所以我可以尝试分别执行它们中的每一个,并且不会超过 50 毫秒(Profiler 告诉我)。但是我有很多行,并且在执行了其中一些行之后(1 000 - 10 000 个非常不同数量的执行行),我得到了一个超时:超时已过期。在操作完成之前超时时间已过或服务器没有响应。即使在“SELECT”查询期间也可以获得超时时间。

我已将 CommandTimout 设置为 120 并得到 从服务器接收结果时发生传输级错误。 (提供者:Session Provider,错误:19 - 物理连接不可用)所以,我认为这不是超时情况。

Profiler 和 traces 没有任何意外。

我使用了SqlConnection.ClearPool(cnnct);,但它不起作用;

请帮忙。

SQL 版本:Microsoft SQL Server 2008 R2 (SP1)

这是源数据库和目标数据库的代码。

    public IEnumerable<SomeType> GetEntities()
    {
        IEnumerable<SomeType> result = null;
        var selectQuery = GetSelectQuery();

        try
        {
            using (var cnnct = new SqlConnection(_connectionString))
            {
                cnnct.Open();
                var cmd = new SqlCommand(selectQuery, cnnct);
                var reader = cmd.ExecuteReader();

                result = Convert(reader);
                reader.Close();
                cmd.Dispose();
            }
        }
        catch (Exception e)
        {
            Catch(selectQuery, e);
        }

        return result;
    }

    public Int32 Save(SomeType entity)
    {
        Int32 result = 0;
        var insertQuery = GetInsertQuery(entity);

        try
        {
            using (var cnnct = new SqlConnection(_connectionString))
            {
                cnnct.Open();
                var cmd = new SqlCommand(insertQuery, cnnct);

                result = (Int32)(Decimal)cmd.ExecuteScalar();
                cmd.Dispose();
            }
        }
        catch (Exception e)
        {
            Catch(insertQuery, e);
        }

        return result;
    }

【问题讨论】:

  • 您是否尝试将超时设置为 0(无限制)以查看它是否真正完成?
  • @Tanner 我已将默认 30 替换为 120 并得到另一个异常(在最初的帖子中描述)。我同意无限制超过 120,但无论如何,当我选择 120 秒时,我没有任何超时问题。我需要找到真正的原因。谢谢。
  • @Tanner Zero 没有帮助。但无论如何,谢谢。
  • 附加信息:我添加了 SqlConnection.ClearAllPools();在每次连接使用并获得新异常后:Connection Timeout Expired。尝试使用登录前握手确认时超时时间已过。这可能是因为登录前握手失败或服务器无法及时响应。尝试连接到此服务器所花费的持续时间是 - [Pre-Login] 初始化 = 1;握手=12345;

标签: c# sql-server sql-server-2008 ado.net timeoutexception


【解决方案1】:

可能是“远程查询超时”选项配置错误?

看看你的实例

EXEC sp_configure 'remote query timeout', 0 ;  
GO  
RECONFIGURE ;  
GO  

【讨论】:

  • 查询太简单了,像SELECT * FROM Entities WHERE Id = 1;它返回几行。在数据库窗口中查询花费的时间少于 50 毫秒。所以问题不在于超时,而在于其他地方。我想在投入生产之前解决真正的问题。超时不是真正的原因。顺便说一句,我将超时增加到 120,并且超时异常被另一个替换(在最初的帖子中描述)。谢谢。
  • 如果更改超时设置给出了一个新错误,那么它与超时设置有关。您现在遇到的错误表明物理连接有问题。检查客户端/服务器连接的稳定性
  • 能否请您提供一条建议,我该如何检查这种稳定性?
  • 其实我是一名 DBA 而不是网络专家。你家里有网络专家吗?...如果没有...请尝试 ping 服务器的 IP 地址和/或其名称,看看名称是否已解析以及是否有任何数据包丢失跨度>
  • 很抱歉 4 年后再次提出这个问题。我遇到了同样的错误,并且能够使用以下命令正确识别 Windows 上的网络故障:ping [db server hostname or ip] -t > logfile.txt。让它运行一段时间,然后用 ctrl + c 终止命令。这使我可以确认与数据库服务器的连接定期丢失。在我同事的工作站上运行相同的测试没有显示任何问题,所以这肯定是我的 PC 网络连接的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
相关资源
最近更新 更多