2

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

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

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

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

我可以增加池中的连接数(虽然我不知道有多少会满足它),但我想了解是什么原因造成的。

4

3 回答 3

2

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

于 2009-03-04T16:13:58.103 回答
1

通常,当您收到异常说您已达到连接池阈值时,您的代码没有正确关闭/处理连接。

我的理论是,您在生产中遇到了一个您不在开发中的数据库异常,因此您的连接保持打开状态。

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

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 个与数据库的连接。我会检查您是否正确关闭了连接。至少在您与数据库通信的地方放置一些日志,以查看那里是否发生异常。

于 2009-02-19T15:54:27.547 回答
0

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

更多可以在这里这里找到。

于 2009-02-19T15:17:25.350 回答