1

在下面的代码中,Provider 对象只有一个 DbConnection 实例。每个阅读器将引用相同的连接实例。根据微软的文档,第二个阅读器将从连接池中获得第二个连接。这可以正常工作。

using (var reader1 as IDataReader = Provider.GetReader(sqlStatement1))
{
    while(reader1.Read())
    {
        using (var reader2 as IDataReader = Provider.GetReader(sqlStatement2))
        {
            while(reader2.Read())
            {
            //Do stuff with both statements
            }
        }
    }
}

只要我使用 Provider 对象,我就想保持连接打开。但是,我不想浪费连接池中的连接。调用 Provider.DbConnection.Close() 会尝试将两个连接都返回到池中吗?如果是这样,我怎样才能将第二个连接返回到连接池?

4

2 回答 2

0

老实说,我会尝试重构,这样您就不需要同时拥有两个开放阅读器。通过将资源占用的时间超过实际读取时间,您可以增加数据库中死锁的机会。

这个问题有时被称为 SELECT 1 + N:对于在第一个选择中返回的每一行,您正在执行一个额外的选择。您将需要重构以解决此问题,但这完全取决于您尝试读取的数据类型。

于 2010-07-27T16:40:45.537 回答
0

在测试了不同的连接提供商之后,我找到了答案。

OleDb 提供程序维护其连接池与 SqlClient 提供程序不同。通常 SqlClient 提供者应该在每次你想连接到数据库时创建一个新的 SqlConnection 对象。连接应关闭或处置。这会将底层连接释放到池中。

然而,OleDb 提供程序的处理方式不同。与其每次都实例化一个新的连接,不如在应用程序结束时使用和处理同一个连接对象。如果使用与SqlClient连接相同的方式,则会抛出“未指定错误”的错误。可以为每个 OleDbCommand 分配相同的 OleDbConnection 实例。如果它已被使用,则底层提供者将为其分配一个新连接。使用 SqlClient 提供程序执行此操作将生成异常。

我原来的连接字符串是这样的:Data Source=....mdb;Provider=Microsoft.Jet.OLEDB.4.0; 这在 128 次连接后结果失败......带有一个非常友好的“未指定错误”。研究了连接池(不是报错),需要加这个参数才能开启连接池。OLE DB 服务 = -1;

启用此功能后,连接按预期运行,没有达到限制。

于 2010-07-28T02:38:35.203 回答