SQL Server连接问题

时间:2011-01-12 16:57:48

标签: asp.net sql sql-server-2008 database-connection

我们最近推出了一个新的网站...在高峰时段大约有大约150名用户活跃。在高峰时段,我们每隔几分钟就会遇到一个问题,下面列出了例外文本。

System.Web.HttpUnhandledException: 
Exception of type 'System.Web.HttpUnhandledException' was thrown. 
---> System.Data.SqlClient.SqlException: The client was unable to establish a connection because of an error during connection initialization process before login. 
Possible causes include the following: 
    the client tried to connect to an unsupported version of SQL Server; 
    the server was too busy to accept new connections; 
    or there was a resource limitation (insufficient memory or maximum allowed connections) on the server. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.) 

我们的数据访问层使用以下语法调用各种DataTableAdapter。

编辑

是的,da是分配给DataTableAdapter的名称。没有connection.Open()因为DataTableAdapter负责所有这些,对吗?

using(TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter da = new TheDataLayer.some.strongly.typedNameTableAdapters.suchAndSuchTableAdapter())
        {
            StronglyTyped.DataTable dt = new StronglyTyped.DataTable();
            da.FillByVariousArguments(dt, ..., ...);
            //da.Dispose();

            return something;
        }

连接字符串类似于:

<add name="MyConnectionString"
        connectionString="Data Source=myDBServerName;Initial Catalog=MyDB;User ID=MyUserName;Password=MyPassword"
        providerName="System.Data.SqlClient" />

我正在尝试将问题排除在Code中。有没有什么“简单”可以做到最小化这个问题?

感谢。

4 个答案:

答案 0 :(得分:4)

您是否在连接字符串设置中直接尝试了“连接池”?

示例:

connectionString="....;Pooling=true;Min Pool Size=1;Max Pool Size=10;..."

您可以在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/8xx3tyca%28v=vs.71%29.aspx

答案 1 :(得分:1)

如果没有看到实际打开并使用连接的代码,很难说问题出在哪里。

请更新您的问题,了解创建DataAdapter时会发生什么(我猜这是da的意思)。

此外,如果您使用的是using语句,则不应该处理为using语句创建的内容。

答案 2 :(得分:1)

我们遇到了类似的问题,这种问题只发生在我们的生产环境中,并且与负载特别相关。在忙碌的一天中,我们会收到上述几个例外情况。

我们对此异常发生的原因进行了大量调查,并进行了大量修改以解决问题。通过将最小池大小设置为1并将最大池大小设置为10(我们可以根据您的具体情况而变化)来解决问题的事实变化是连接池设置。

当您拥有多个(即1000个)客户数据库并使用默认连接字符串(即database = DBName; server = ServerName)时,此问题将更为普遍。我们没有明确设置最小/最大池大小,因此它采用默认设置将最小池大小设置为0,最大池大小设置为100.

同样,我没有具体的证据,但理论上说,在基于负载的一天繁忙时间,它与DB服务器建立了多个连接,并且DB服务器在单点到多个数据库中被大量连接请求轰炸。应用程序服务器或数据库服务器确实具有在短时间内处理这么多连接的带宽。此外,它与大多数数据库的服务器一起发生。虽然我们一次没有看到很多连接,但是当请求数量激增时,应用程序服务器无法在短时间内连接到数据库。

在我们设置了最小池大小之后我们就解决了这个问题,因为每个数据库都有至少一个连接,它始终可用,如果有需要连接到多个数据库的请求,我们已经有至少一个连接到在我们申请新数据库之前,数据库可用。

答案 3 :(得分:0)

可能与您遇到的实际问题无关,但如果您尝试连接而未指定正确的端口以及数据库服务器名称,则也会抛出此错误。