2

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

现在的代码是这样的:

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

等等,等等。但这是每线程一次。显然不是我想要的。

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

尽管它很愚蠢,但即使是具体子类的 MSDN 文档也没有说明您是否可以这样做。例如,该方法的msdn文档没有说明它是否是线程安全的。互联网上的一些不同指南只是打开一个实例,它会做线程池,这很好,但如果你这样做:SqlClientFactoryCreateDataAdapter()SqlConnection

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

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

那么获取工厂并从多个线程中使用它是线程安全的吗?

4

1 回答 1

1

MSDN说:-

线程安全:

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

于 2013-10-22T19:19:24.430 回答