我在我的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;
}
}
答案 0 :(得分:1)
它看起来很好,但可能不会产生有趣的效率。
.NET中的对象创建很快。所以创建工厂并不需要花费很多时间。从远程数据库获取连接确实存在,但是通过连接池,这通常不是问题。
工厂可能似乎没有实施它自己的任何状态&看起来它可能是不可改变的。所以来自不同线程的访问可能没问题。
静态对象不是垃圾收集的。我怀疑工厂的规模是否会增长,所以这不应该成为一个问题。
所以你要避免一堆廉价的对象创建,一堆廉价的后台垃圾收集,并且派生类实际上具有状态而不是线程安全的风险很小,具体取决于GetFactory返回的确切实现