OLE DB 服务和 Microsoft Access 数据库 (MDB) 的连接池

问题描述 投票:0回答:1

在写入 Microsoft Access 文件 (MDB) 时,与保持连接打开相比,使用连接池时我发现性能较慢。

Access 数据库的连接池OLE DB 资源池中所述,我在我的连接字符串中使用

OLE DB Services = -1;
(所有服务)并且我有一个连接对象的打开实例以启用OLE DB 资源池。

这里是一个简单的 C# 类的代码,演示了这一点:

using System.Data.OleDb;
using System.Diagnostics;

AccessConnectionPooling test = new AccessConnectionPooling();

test.ClosedConnectionTest();
test.OpenConnectionTest();

public class AccessConnectionPooling
{

    string _provider = "Microsoft.Jet.OLEDB.4.0";
    string _dataSource = "D:\\Temp\\AccessConnectionPooling\\Test.mdb";
    OleDbConnection _connection;

    public AccessConnectionPooling()
    {
        // Create one open instance of a Connection object
        _connection = new OleDbConnection(GetConnectionString());
        _connection.Open();
    }

    public void OpenConnectionTest() {

        EmptyTable();

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < 10000; i++)
        {
            WriteRecord(_connection);
        }

        sw.Stop();
        Console.WriteLine("Open Connection test took " + sw.Elapsed.TotalSeconds);

    }

    public void ClosedConnectionTest()
    {

        EmptyTable();

        Stopwatch sw = new Stopwatch();
        sw.Start();

        for (int i = 0; i < 10000; i++)
        {
            using OleDbConnection connection = new OleDbConnection(GetConnectionString());
            {
                connection.Open();
                WriteRecord(connection);
                connection.Close();

            }
        }

        sw.Stop();
        Console.WriteLine("Closed Connection test took " + sw.Elapsed.TotalSeconds);

    }

    void WriteRecord(OleDbConnection connection)
    {

        string sqlStatement = "INSERT INTO Test (TestEntry) VALUES ('" + DateTime.Now.ToString() + "')";
        OleDbCommand command = new OleDbCommand(sqlStatement);

        command.Connection = connection;
        command.ExecuteNonQuery();

    }

    void EmptyTable()
    {

        using OleDbConnection connection = new OleDbConnection(GetConnectionString());
        {
            connection.Open();

            string sqlStatement = "DELETE * FROM Test";
            OleDbCommand command = new OleDbCommand(sqlStatement);

            command.Connection = connection;
            command.ExecuteNonQuery();

            connection.Close();

        }

    }

    string GetConnectionString()
    {
        OleDbConnectionStringBuilder builder = new OleDbConnectionStringBuilder();

        builder.Provider = _provider;
        builder.DataSource = _dataSource;
        builder.Add("OLE DB Services", -1);

        return builder.ConnectionString;

    }


}

输出:

Closed Connection test took 6.7153514
Open Connection test took 2.4232343

我正在使用的 Test.mdb 有一个

Test
表,其中包含一个短文本类型的
TestEntry
字段。

没有

OLE DB Services = -1;
属性:

Closed Connection test took 383.1940438
Open Connection test took 2.386315

我读过的所有内容都指向使用连接池,但我的测试结果表明这样做会产生性能成本,至少对于 MDB 是这样。

我知道有使用 MDB 的替代方法,但这些是我正在处理的当前要求。

ms-access connection-pooling oledbconnection
1个回答
0
投票

虽然

OLE DB Services = -1;
与连接字符串中没有它相比有很大的不同,但 OLE DB 资源池 文章确实指出至少一个连接应该保持打开状态才能从资源池中受益:

对于基于 ADO 的消费者,通过保留一个打开的实例 每个唯一用户的连接对象并使用 OLEDB_SERVICES 用于启用或禁用池的连接字符串属性。默认情况下, ADO 尝试使用池,但如果您不保留至少一个池 为每个用户打开一个 Connection 对象的实例,不会有 您的应用程序可用的持久池。 (然而,微软 只要连接存在,Transaction Server 就会保持池的持久性 其中尚未发布,也没有最终超时。)

问题代码已更新,并有一个保持打开的连接实例。

© www.soinside.com 2019 - 2024. All rights reserved.