为什么连接池在不同服务器上的表现不同?

时间:2009-02-19 14:58:05

标签: .net sql-server-2005 connection-pooling

我们有一个程序可以读入输入流并将其写入数据库。没有用户输入。

该程序当前在开发和生产服务器上并行运行,输入数据与输入相同,写入不同的输出服务器。

在开发服务器上一切都很好;大约30多个池化连接一次打开并且运行愉快(这可能听起来很高,但我们对每个输入运行几个连续的简短查询,并且存在大量数据)。在生产服务器上,它总是超过100个连接,有时会抛出一个异常,表明它已经用完了池中的可用连接。

是否存在可能导致此差异的某种SQL Server设置?唯一的另一个区别是生产服务器受到各种来源的额外负载。

我可以增加池中的连接数(虽然我不知道有多少会满足它),但我想了解导致这种情况的原因。

3 个答案:

答案 0 :(得分:2)

答案结果是我在我的SqlDataReaders上设置CommandBehaviour.CloseConnection的方式是错误的(我没有正确使用按位组合)。所以我毕竟是在泄漏连接。

答案 1 :(得分:1)

通常当您收到异常表示您已达到连接池阈值时,您的代码未正确关闭/处置连接。

我的理论是,你在生产中遇到的数据库异常,你不是开发人员,因为这个,你的连接是保持开放的。

您应该始终在Try / Catch中执行数据库工作,声明外部的连接和命令并在内部初始化。你永远不应该依赖关闭try / catch中的连接总是在finally块中关闭/ dispose:

try
{
    m_Connection = this.getConnection();
    m_Command = this.getCommand();
    m_Command.CommandTimeout = m_ConnectionTimeout;
    m_Command.CommandText = sql;
    m_Command.Connection = m_Connection;
    m_Command.CommandType = CommandType.Text;

    m_Connection.Open();

    return m_Command.ExecuteNonQuery();
}
finally
{
    if (m_Connection != null && m_Connection.State != ConnectionState.Closed)
    {
        m_Connection.Close();
        m_Connection.Dispose();
    }

    if (m_Command != null)
        m_Command.Dispose();
}

一个应用程序实际上不应该消耗100个与数据库的连接。我会检查你是否正确关闭你的连接。至少在您与DB通信的位置放置一些日志记录,以查看是否存在异常。

答案 2 :(得分:0)

连接池是一个ado.net问题,因为SQL Server不进行连接池。从内存来看,ado.net的连接池最大大小为100,因此您可以达到最大值。您可以在应用程序中尝试的几件事情是使用连接字符串中的最小池大小和最大池大小来硬设置连接池。

可以找到更多herehere