2

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

1 回答 1

1

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

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

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

静态对象不会被垃圾收集。我怀疑工厂的规模会扩大,所以这应该不是问题。

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

于 2014-03-22T00:55:45.283 回答