Dan*_*nov 6 .net c# ado.net multithreading
考虑到在运行时指定了ADO.NET实现,使用ADO.NET IDbConnection和IDbCommand可以针对同一个数据库同时执行多个命令.
MSDN文档for IDbConnection
未指定任何线程限制.该SqlConnection
页面有标准的声明说:" 任何实例成员不能保证线程安全的. "在IDbCommand
和SqlCommand
文档同样是联合国信息.
假设没有单个实例成员是线程安全的,我仍然可以从连接创建多个命令(在同一个线程上),然后在不同的线程上同时执行它们.
据推测,这仍然无法达到预期的效果,因为(我假设)在数据库的单个底层连接上一次只能执行一个命令.因此,并发IDbCommand
执行将在连接处被序列化.
所以这意味着我们必须创建一个单独的IDbConnection
,如果你知道你正在使用它,这是好的,SqlConnection
因为它支持池.如果在运行时确定了ADO.NET实现,则无法进行这些假设.
这是否意味着我需要实现自己的连接池以支持对数据库的高性能多线程访问?
您将需要管理对实例成员的线程访问,但大多数 ADO 实现都管理它们自己的连接池。他们通常期望多个查询同时运行。
我可以根据需要随意打开和关闭尽可能多的连接,并处理如果池不可用可能引发的异常。