Asp.net 静态缓存DatabaseFactory.CreateDatabase是否可接受?

Asp.net 静态缓存DatabaseFactory.CreateDatabase是否可接受?,asp.net,database,enterprise-library,Asp.net,Database,Enterprise Library,在应用程序启动时缓存数据库连接的实例是否可以接受 关于线程上的安全性,我引用: 此类型的任何公共静态[…]成员都是线程安全的。任何实例成员都不能保证线程安全 鉴于此,以下示例中的代码是否可接受/安全: public static class BookingMapper { public static Database Db { get; set; } static BookingMapper() { Db = DatabaseFactory.CreateDatabase()

在应用程序启动时缓存数据库连接的实例是否可以接受

关于线程上的安全性,我引用:

此类型的任何公共静态[…]成员都是线程安全的。任何实例成员都不能保证线程安全

鉴于此,以下示例中的代码是否可接受/安全:

public static class BookingMapper
{
  public static Database Db { get; set; }

  static BookingMapper()
  {
    Db = DatabaseFactory.CreateDatabase();
  }

  public static string GetBooking(int id)
  {
    using (DbCommand cmd = Db.GetStoredProcCommand("getBooking"))
    {
      Db.AddInParameter(cmd, "@Id", DbType.Int32, id);
      using (IDataReader dr = Db.ExecuteReader(cmd))
      {
        ...
      }
    }
  }
}
如果可以接受,那么使用这种方法比在每个方法调用上简单地实例化数据库有哪些优点/缺点

提前谢谢

更新:

进一步的研究让我找到了PrimaryObjects.com,它在
使用数据库工厂的部分表明这是可以接受的。但我仍然想知道这样做是否有好处/坏处

有两种方法可以解释MSDN中关于线程安全的标准短语,我希望他们能澄清这一点。你的解释很好,但我相信它的意思是:

属于此类型的任何成员(方法、字段、属性等),并且是公共和静态的,都是线程安全的

(例如,有两种解释“此类成员”的方法)

2) 通常,您不想在周围共享db连接—您想打开一个连接,完成您的工作,然后关闭它。通常不能将多个打开的读卡器与单个连接关联(这是通用的db/连接建议,而不是特定于ent库)


3) 在ent库内部的进一步阅读中,CreateDatabase调用返回的数据库对象本身并不是连接,并且它看起来像我在第2点中所述的那样处理连接管理。因此,看起来数据库对象本身可以安全地共享。

@damien,我在这个主题上做了更多的搜索,我在编辑中提到过。这样做似乎没什么问题,但似乎没有对利弊进行任何分析。从第3点来看,创建实例本身并没有带来太多好处。我在查看源代码后提出了第3点,安装ent lib后可以从“src”目录安装。然后,您可以进入并查看在各种函数中完成了多少工作。(或者,如果您不想安装源,Reflector可以提供类似信息)