.net DbProviderFactory线程安全吗?

时间:2013-10-22 19:16:41

标签: .net sql-server database multithreading dbproviderfactories

我正在重构一些基于DbProviderFactory的旧代码以利用连接池,但我遇到了一个简单的问题:DbProviderFactories.GetFactory()返回的对象是否是线程安全的?

现在的代码是:

DbProviderFactory factory = DbProviderFactories.GetFactory("Provider String from config");
var connection = factory.CreateConnection();
connection.ConnectionString = "connection string from config";

等等,但这是在PER THREAD完成的。显然不是我想要的。

我想知道我是否可以到处使用“工厂”对象?我可以在同一个DbProviderFactory对象的不同线程中创建多个连接吗?我可以再次从同一家工厂创建DbAdapter课程吗?

尽管很愚蠢,但即使是具体的子类,MSDN文档也没有说明你是否可以这样做。例如,SqlClientFactory方法的CreateDataAdapter()的{​​{3}}并未说明它是否是线程安全的。互联网上的一些不同的指南只是打开一个SqlConnection的实例,它会进行线程池化,这很好,但是如果你这样做的话:

SqlConnection connection = new SqlConnection("my connection string);
DbDataAdapter adapt = DbProviderFactories.GetFactory(connection).CreateDataAdapter();

这是线程安全的吗?有多少个那些工厂?那个GetFactory方法在线程中返回什么?永远是同一个对象?或不?我正在修改的现有代码大量使用DbDataAdapter,所以我真的不想改变所有这些代码。

因此,从多个线程中获取工厂并使用它是否是线程安全的?

1 个答案:

答案 0 :(得分:1)

MSDN 说: -

  

线程安全:

     

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全