多线程Windows服务中的多个同时SQL连接超时

我有一个使用VS 2010(.NET 4.0)开发的多线程Windows服务,它可以有几个线程到几十个线程,每个线程都通过Internet从慢速服务器检索数据,然后使用本地数据库记录数据(所以这个过程是互联网绑定的,而不是局域网或CPU绑定的)。

有了一些规律性,我同时从几个线程中得到了以下错误的洪水/乱舞/爆发:

System.Data.SqlClient.SqlException(0x80131904):超时过期。 操作完成之前超时的时间或服务器没有响应。

这个错误的调用栈通常是:

在System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection拥有对象)

在System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection拥有连接)

在System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory)

在System.Data.SqlClient.SqlConnection.Open()

我没有在连接字符串中指定连接超时,并且此数据库中还有其他应用程序和进程正在工作。 有没有人遇到过这种行为,如果有的话,做了什么来阻止它?

我的数据访问层中最常用的方法如下所示,而我所有其他的DAL方法都遵循相同的方法:

using (SqlConnection con = new SqlConnection(GetConnectionString()))
using (SqlCommand cmd = new SqlCommand("AddGdsMonitorLogEntry", con))
{
    cmd.CommandType = CommandType.StoredProcedure;

    /* setting cmd.Parameters [snipped] */

    // We have been getting some timeouts writing to the log; wait a little longer than the default.
    cmd.CommandTimeout *= 4;

    con.Open();

    cmd.ExecuteNonQuery();
}

非常感谢!

编辑

考虑到在镜像环境中发生这种情况的评论,我应该确实提到正在讨论的数据库是镜像的。 它在SSMS中标记为“Principal,Synchronized”,在“没有自动故障转移(同步)的高安全性”模式中。

编辑5/26/11

我没有在SQL Server日志中看到任何问题。 (我无法访问该服务器上的Windows事件查看器,但我已要求某人寻找我。)


根据今天刚刚创建的MSDN博客帖子(为Google而欢呼!):

微软已经确认这是当前ADO.NET版本中的一个问题。 此问题将在Visual Studio 2011附带的ADO.NET版本中修复。

同时,我们请求使用以下解决方法:

  • 将连接字符串超时时间增加到150秒。 这会给第一次尝试足够的时间来连接(150 * .08 = 12秒)

  • 在连接字符串中添加MinPool Size = 20。 这将始终保持池中至少20个连接,并且创建新连接的机会将减少,从而减少出现此错误的几率。

  • 提高网络性能。 将您的网卡驱动程序更新到最新的固件版本。 当您的NIC卡与某些Scalable Networking Pack设置不兼容时,我们已经看到网络延迟。 如果您使用的是Windows Vista SP1或更高版本,则可能会考虑禁用接收窗口自动调整功能。 如果您启用了NIC绑定,禁用它将是一个不错的选择。

  • 该帖子本身是一个有趣的阅读,谈论TCP / IP连接重试算法。 并赞扬所有的人谁说:“嘿,这看起来像它与镜像......”! 并注意关于这个问题的评论:“由于SQL Server响应缓慢或网络延迟”。

    啊!!!

    感谢所有发布的人。 现在我们必须向.NET Framework(或其他一些ADO.NET修补机制)寻求补丁,所以我们不必等待(并购买)Visual Studio 11 ...


    连接超时与命令超时不同。 命令超时适用于建立连接时的情况,但由于某些内部原因,服务器无法在所需时间内返回任何结果。 默认命令超时是30秒。 http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx

    尝试在连接字符串中指定连接超时。 默认值是15秒,这可能是您看到问题的原因。 您还可以在代码中指定连接超时:http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx


    我每隔一段时间就会在这个旧数据库服务器上得到这个(我们现在已经有10年了)。 当它发生的时候,虽然这是因为有些东西在不断地用连接/查询来锤击这件事。 我的猜测是,你会发现当数据库服务器发生负载时(或者大量的连接或者这些线上的某些东西)无论如何,根据我的经验,如果你可以优化代码,优化数据库,变得更加强大数据库服务器等都有所帮助。 Piotr建议你可以做的另一件事是简单地延长连接的超时时间。 我仍然会通过并优化一些东西,虽然(应该从长远来看有所帮助)。

    链接地址: http://www.djcxy.com/p/56673.html

    上一篇: Multiple Simultaneous SQL Connection Timeouts In Multithreaded Windows Service

    下一篇: Xml schema serialization of complextype with data annotation validations