在应用程序启动时缓存数据库连接的实例是否可以接受?
关于线程安全的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
部分表明这是可以接受的。但我仍然想知道这样做是否有利有弊?
答案 0 :(得分:3)
1)有两种方法可以解释MSDN上关于线程安全的标准短语,我希望他们能够澄清它。你的解释会很好,但我相信这意味着:
属于此类型且属于公共和静态的任何成员(方法,字段,属性等)都是线程安全的
(例如,有两种方法可以解释“这种类型的成员”这一短语)
2)通常,您不希望共享数据库连接 - 您想要打开连接,完成工作并关闭它。您通常不能将多个打开的读取器与单个连接相关联(这是通用的db / connection建议,而不是特定于库的。)
3)在ent库中进一步读取时,CreateDatabase调用返回的Database对象本身不是连接,看起来像我在第2点中所说的那样处理连接管理。所以它看起来像数据库对象本身可以安全地共享。