我在asp.net应用程序中使用以下代码。根据这段代码,对于应用程序的所有用户来说,只有一个DBProviderFactory实例。这会在多用户环境中造成问题吗?因此,所有用户都将使用相同的DbProviderFactory对象来创建连接。我不确定这是否会在多用户环境中产生某种类型的隐藏问题。
我之所以使用DbProviderFactory的静态实例,是因为每次需要实例化连接时都不会调用GetFactory方法。我认为,这样可以更快地获得连接对象。我的推理有缺陷吗?
public class DatabaseAccess
{
private static readonly DbProviderFactory _dbProviderFactory =
DbProviderFactories.GetFactory(System.Configuration.ConfigurationManager.ConnectionStrings["DB"].ProviderName);
public static DbConnection GetDbConnection()
{
DbConnection con = _dbProviderFactory.CreateConnection();
con.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DB"].ConnectionString;
return con;
}
}
它看起来不错,但可能不会产生有趣的效率。
在.NET中创建对象很快。因此,创建工厂不需要花费太多时间。从远程数据库获取连接确实可以,但对于连接池,这通常不是问题。
工厂可能没有实现自己的任何状态&看起来它可能是不可变的。因此,从不同线程进行访问可能是可以的。
静态对象不会被垃圾收集。我怀疑工厂的规模会扩大,所以这应该不是问题。
因此,您可以避免大量廉价的对象创建、大量廉价的后台垃圾收集,并且根据GetFactory 返回的确切实现,派生类实际上具有状态而不是线程安全的风险很小。