3

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

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

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

4

2 回答 2

4

要扩展 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
    }
于 2012-05-20T19:44:03.700 回答
3

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

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

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

于 2012-05-20T17:07:12.770 回答