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。

感谢

Db连接对象的生命周期

因为ADO.NET已经使用了连接池,所以不需要缓存/重用DbConnection实例。考虑到这一点,您的类似乎没有添加任何有用的东西,而不是简单地写出代码——您唯一要抽象掉的是连接字符串,这可以通过使其可配置(ConnectionStrings["DatabaseName"])来充分处理。

除了缺乏附加值之外,你的课还有其他问题。捕获NullReferenceException是一个很大的禁忌——NullReferenceException表示代码中有一个严重的错误,应该通过调查崩溃来修复,而不是将其包装为另一个异常(包装时,不要使用Exception,因为它不具体,客户端在不捕获所有内容的情况下无法捕获它,这是另一件坏事)。当然,更好的是,应该通过适当地检查null来防止它(请参阅什么是NullReferenceException,以及我如何修复它?)

要了解为什么您的类可能没有用处,请考虑CloseFactoryConnection可以简化为以下内容,而不会损失任何功能:

public void CloseFactoryConnection() {
    using (oConnection) { }
}

因此,为了给你的问题一个大致的答案:如果你不使用ORM,你可能根本不想要一个用于建立数据库连接的类,除了你已经拥有的类之外。如果您想使用依赖项注入来获取数据,请不要在这个级别使用它,而是在对象级别使用它——您希望能够从使用数据库中抽象出来,而不仅仅是从创建DataSet的方式中抽象出来。