【发布时间】:2010-02-05 11:25:54
【问题描述】:
目标
鉴于ADO.NET 实现是在运行时指定的,请使用 ADO.NET IDbConnection 和 IDbCommand 同时针对同一个数据库执行多个命令。
调查
IDbConnection 的 MSDN 文档未指定任何线程限制。 SqlConnection 页面的标准免责声明说“任何实例成员都不能保证是线程安全的。”IDbCommand 和 SqlCommand 文档同样不提供信息。
假设没有单个实例成员是线程安全的,我仍然可以从一个连接(在同一个线程上)创建多个命令,然后在不同的线程上同时执行它们。
大概这仍然无法达到预期的效果,因为(我假设)在与数据库的单个底层连接上一次只能执行一个命令。因此并发的IDbCommand 执行将在连接处被序列化。
结论
所以这意味着我们必须创建一个单独的IDbConnection,如果你知道你正在使用SqlConnection,这是可以的,因为它支持池化。如果您的 ADO.NET 实现是在运行时确定的,则无法做出这些假设。
这是否意味着我需要实现自己的连接池以支持对数据库的高性能多线程访问?
【问题讨论】:
标签: c# .net multithreading ado.net