在ADO.NET中使用DbProviderFactory的静态实例?

时间:2012-07-15 22:03:57

标签: ado.net dbproviderfactories

我在我的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;
    }
}

1 个答案:

答案 0 :(得分:1)

它看起来很好,但可能不会产生有趣的效率。

.NET中的对象创建很快。所以创建工厂并不需要花费很多时间。从远程数据库获取连接确实存在,但是通过连接池,这通常不是问题。

工厂可能似乎没有实施它自己的任何状态&看起来它可能是不可改变的。所以来自不同线程的访问可能没问题。

静态对象不是垃圾收集的。我怀疑工厂的规模是否会增长,所以这不应该成为一个问题。

所以你要避免一堆廉价的对象创建,一堆廉价的后台垃圾收集,并且派生类实际上具有状态而不是线程安全的风险很小,具体取决于GetFactory返回的确切实现