Db连接对象的生命周期
本文关键字:生命 周期 对象 连接 Db | 更新日期: 2023-09-27 18:27:05
详细信息-我在C#中有一个SQL数据库助手,它有一个方法(如下所示)来建立连接
public void EstablishConnection()
{
oConnection = oFactory.CreateConnection();
if (oConnection.State == ConnectionState.Closed)
{
oConnection.ConnectionString = StringConnection;
oConnection.Open();
oConnectionState = ConnectionState.Open;
}
}
对于像(ExecuteNonQuery等)这样的数据库方法的任何调用,这就是典型方法看起来像的样子
public DataSet DataAdapter(CommandType cmdType, string cmdText, Parameters[] cmdParms)
{
DbDataAdapter dda = null;
try
{
EstablishFactoryConnection();
dda = oFactory.CreateDataAdapter();
PrepareCommand(false, cmdType, cmdText, cmdParms);
dda.SelectCommand = oCommand;
DataSet ds = new DataSet();
dda.Fill(ds);
return ds;
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (null != oCommand)
oCommand.Dispose();
CloseFactoryConnection();
}
}
以及CloseFactoryConnection();方法类似于
public void CloseFactoryConnection()
{
//check for an open connection
try
{
if (oConnection.State == ConnectionState.Open)
{
oConnection.Close();
oConnectionState = ConnectionState.Closed;
}
}
catch (DbException oDbErr)
{
//catch any SQL server data provider generated error messag
throw new Exception(oDbErr.Message);
}
catch (System.NullReferenceException oNullErr)
{
throw new Exception(oNullErr.Message);
}
finally
{
if (null != oConnection)
oConnection.Dispose();
}
}
问题-我的所有存储库中都使用了这个类(DBHelper),IOC容器构造函数在其中注入了这个类。这些实例的生活方式是HttpContextLifecycle(我使用的是Structuremap,它说这种生活方式意味着将为每个HttpContext创建一个实例。缓存HttpContext.Items集合中的实例。)
对于我正在使用的数据库连接类来说,这是正确的生活方式吗?
创建连接/打开连接/关闭连接的类是否应该作为单例实例化?或者根据请求?
对于这些建立数据库连接的类来说,普遍接受的生活方式是什么?我使用的是ado.net,没有ORM。
感谢
因为ADO.NET已经使用了连接池,所以不需要缓存/重用DbConnection
实例。考虑到这一点,您的类似乎没有添加任何有用的东西,而不是简单地写出代码——您唯一要抽象掉的是连接字符串,这可以通过使其可配置(ConnectionStrings["DatabaseName"]
)来充分处理。
除了缺乏附加值之外,你的课还有其他问题。捕获NullReferenceException
是一个很大的禁忌——NullReferenceException
表示代码中有一个严重的错误,应该通过调查崩溃来修复,而不是将其包装为另一个异常(包装时,不要使用Exception
,因为它不具体,客户端在不捕获所有内容的情况下无法捕获它,这是另一件坏事)。当然,更好的是,应该通过适当地检查null
来防止它(请参阅什么是NullReferenceException,以及我如何修复它?)
要了解为什么您的类可能没有用处,请考虑CloseFactoryConnection
可以简化为以下内容,而不会损失任何功能:
public void CloseFactoryConnection() {
using (oConnection) { }
}
因此,为了给你的问题一个大致的答案:如果你不使用ORM,你可能根本不想要一个用于建立数据库连接的类,除了你已经拥有的类之外。如果您想使用依赖项注入来获取数据,请不要在这个级别使用它,而是在对象级别使用它——您希望能够从使用数据库中抽象出来,而不仅仅是从创建DataSet
的方式中抽象出来。