在写入 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 的替代方法,但这些是我正在处理的当前要求。
虽然
OLE DB Services = -1;
与连接字符串中没有它相比有很大的不同,但 OLE DB 资源池 文章确实指出至少一个连接应该保持打开状态才能从资源池中受益:
对于基于 ADO 的消费者,通过保留一个打开的实例 每个唯一用户的连接对象并使用 OLEDB_SERVICES 用于启用或禁用池的连接字符串属性。默认情况下, ADO 尝试使用池,但如果您不保留至少一个池 为每个用户打开一个 Connection 对象的实例,不会有 您的应用程序可用的持久池。 (然而,微软 只要连接存在,Transaction Server 就会保持池的持久性 其中尚未发布,也没有最终超时。)
问题代码已更新,并有一个保持打开的连接实例。