正确使用 C# 和 MySQL 的连接

本文关键字:MySQL 连接 | 更新日期: 2023-09-27 18:34:40

C#/MySQL交互的一个典型例子涉及这样的代码(为了简单起见,我跳过了try/catches和错误检查(:

conn = new MySqlConnection(cs);
conn.Open();
string stm = "SELECT * FROM Authors";
MySqlCommand cmd = new MySqlCommand(stm, conn);
rdr = cmd.ExecuteReader();

该方案是独立应用程序和 WCF Web 服务的类库。那么,我是否应该在每次进行查询时打开连接?还是应该在打开程序时打开一次?

正确使用 C# 和 MySQL 的连接

要扩展HackedByChinese的建议,请考虑以下内容。 您有一个主要的协调方法,用于处理连接创建、打开连接、设置事务,然后调用执行不同类型工作(查询(的工作器方法。

  public static void UpdateMyObject(string connection, object myobject)
        {
        try
        {
            using (SqlConnection con = new SqlConnection(connection))
            {
                con.Open();
                using (SqlTransaction trans = con.BeginTransaction())
                {
                    WorkingMethod1(con, myobject);
                    WorkingMethod2(con, myobject);
                    WorkingMethod3(con, myobject);
                    trans.Commit();
                }
                con.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("SOMETHING BAD HAPPENED!!!!!!!  {0}", ex.Message);
        }
    }
    private static void WorkingMethod1(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }
    private static void WorkingMethod2(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }
    private static void WorkingMethod3(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }

您通常希望为每个工作单元打开一个连接。MySQL ADO.NET 驱动程序可以为您池化连接,但是,我建议不要让每个查询打开一个连接。可能发生的情况是,您开始使用多种方法来为一个业务事务提供服务,并且由于每种方法都打开一个连接,因此最终可能会使该业务事务耗尽可用的连接。这当然会导致超时、性能不佳等。

相反,请考虑定义一个创建和打开连接和事务的 IUnitOfWork/UnitOfWork API,并让数据访问层请求当前IUnitOfWork,这将提供当前连接和事务。

当然,诀窍是知道一个工作单元何时开始和何时结束。它们与完整、有意义的操作("业务事务"(相关联。例如,当您正在为某个 WCF 服务上的方法的请求提供服务时。当服务实例启动时,应创建一个工作单元以响应请求。然后,DAL 组件可以请求当前工作单元并使用它。然后,当请求完成时,应提交工作单元(应提交事务并关闭连接(。