正确使用与 C# 和 MySQL 的连接

Posted

技术标签:

【中文标题】正确使用与 C# 和 MySQL 的连接【英文标题】:Correct use of connections with C# and MySQL 【发布时间】:2012-05-20 16:19:48 【问题描述】:

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 服务的类库。那么,我是否应该在进行查询时打开连接?还是应该在打开程序的时候打开一次?

【问题讨论】:

首先,您不应该忘记关闭连接(最好将连接包装在 using 语句中)。连接是非托管资源,在显式关闭之前一直保持活动状态。连接的打开时间永远不应超过所需时间,因此在应用程序的整个生命周期中使用单个连接是一个非常糟糕的主意。 是的,我知道关闭问题。所以我要做的是,打个比方,在单个查询或一组后续查询中分解所有数据库活动,执行一致的“动作”/“操作”(例如,带有一些 INSERT 的循环)并在之前打开和关闭这些操作后的连接? 【参考方案1】:

要扩展 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
    

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于正确使用与 C# 和 MySQL 的连接的主要内容,如果未能解决你的问题,请参考以下文章

如何形成正确的 MySQL 连接字符串? [关闭]

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

与 MySql 的连接正在自动中止。如何正确配置Connector/J?

Spring 应用程序在 8 小时后失去与 MySql 的连接。如何正确配置?

C# SqlCommandBuilder,CommandUpdate - 如何使用外部连接表编写基于选择的正确更新

原创: spring boot5 与 mysql8 正确连接