【问题标题】:Is static caching DatabaseFactory.CreateDatabase acceptable?静态缓存 DatabaseFactory.CreateDatabase 可以接受吗?
【发布时间】:2010-01-05 12:56:49
【问题描述】:

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

查看MSDN documentation 的线程安全,我引用:

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

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

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 article,在 Putting the Database Factory to Use 部分中表明这是可以接受的。但我仍然想知道这样做是否有优点/缺点?

Similar question

【问题讨论】:

    标签: asp.net database enterprise-library


    【解决方案1】:

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

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

    (例如,有两种方式来解释子短语“这种类型的成员”)

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

    3) 在 ent 库中进一步阅读时,由 CreateDatabase 调用返回的 Database 对象本身并不是一个连接,看起来连接管理已按照我在第 2 点中的说明进行处理。所以它看起来像数据库对象本身可以安全地共享。

    【讨论】:

    • @damien,我在这个主题上做了更多的搜索,我在编辑中提到了primaryobjects.com/CMS/Article81.aspx。这样做似乎还可以,但似乎没有任何利弊分析。
    • 从第 3 点来看,除了创建实例本身的节省之外,并没有太多好处。
    • 我在查看源代码后提出了第 3 点,它可以在安装 ent lib 后从“src”目录安装。然后你可以进去看看各个函数里面做了多少工作。 (或者如果你不想安装源,Reflector 可以给你类似的信息)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2016-04-29
    相关资源
    最近更新 更多