MySql Connection 方法是不是支持异步编程?

Posted

技术标签:

【中文标题】MySql Connection 方法是不是支持异步编程?【英文标题】:Does MySql Connection methods support async programming?MySql Connection 方法是否支持异步编程? 【发布时间】:2018-11-06 11:25:57 【问题描述】:

我正在使用一种简单的方法连接到 mysql 数据库,但连接到该数据库需要一段时间,这会导致应用程序处于“无响应”模式。 现在,我可以使用 async 来解决这个问题吗?

脚本是:

Private void button_clicked()

MysqlConnection connection = new MysqlConnection(constring);
connection.open();

【问题讨论】:

如果您能提供minimal reproducible example,那就太好了。 bugs.mysql.com/bug.php?id=70111 和 ***.com/questions/30551459/… 可能值得一读。 Mjwills:非常感谢! 【参考方案1】:

MySQL Connector/NET(即 MySql.Data)公开了异步 ADO.NET 方法,例如 MySqlConnection.OpenAsyncMySqlCommand.ExecuteNonQueryAsync,但这些方法都是同步执行的。这是 Connector/NET 中的 longstanding bug。

您可以通过切换到 MySqlConnector(NuGet、GitHub)来获得异步数据库操作,这是一种提供异步 I/O 和更高性能的 OSS 替代方案。

【讨论】:

但是我解决了!使用 Mysql.Data 可以更好地处理任务并且它在异步性能方面没有任何问题.. @bradleyGrainger 如果您必须使用 MySql.Data 并且从 UI 线程调用它,那么使用 Task.Run 是将工作移至后台线程的唯一方法。但总的来说,在大多数环境中,使用Task.Run 使阻塞工作异步是一个坏主意:blog.stephencleary.com/2013/11/…【参考方案2】:

MySql.Data.MySqlClient.MySqlConnection.OpenAsync() 执行同步,而 MySqlConnector.MySqlConnection.OpenAsync() 执行异步

【讨论】:

【参考方案3】:

我相信这是可能的。除了像下面这样构建代码 (source):

public Task<DataSet> GetDataSetAsync(string sConnectionString, string sSQL, params SqlParameter[] parameters)

    return Task.Run(() =>
    
        using (var newConnection = new SqlConnection(sConnectionString))
        using (var mySQLAdapter = new SqlDataAdapter(sSQL, newConnection))
        
            mySQLAdapter.SelectCommand.CommandType = CommandType.Text;
            if (parameters != null) mySQLAdapter.SelectCommand.Parameters.AddRange(parameters);

            DataSet myDataSet = new DataSet();
            mySQLAdapter.Fill(myDataSet);
            return myDataSet;
        
    );

结合使用“await”关键字,将为您提供所需的结果。

//Use Async method to get data
DataSet results = await GetDataSetAsync(sConnectionString, sSQL, sqlParams);

还可以通过添加“Asynchronous Processing=true”连接属性来更新连接字符串 (source)

我还建议您查看“OpenAsync”方法。您可以在docs 中了解更多信息。

【讨论】:

使用Task.Run 将阻塞代码卸载到线程池是一个坏主意:blog.stephencleary.com/2013/11/… 相反,使用 MySqlConnector github.com/mysql-net/MySqlConnector 来获得真正的异步数据库操作。最后Asynchronous Processing=true是一个SQL Server连接字符串选项;如果您尝试将其与 MySQL 一起使用,它将引发错误。 您应该在连接字符串中使用 Asynchronous Prossesing 选项...这是正确的,这是针对 Sql 而不是针对 Mysql...但我尝试了这个:1.made 相关的 void async 2.做了一个任务并运行它 3. 让任务等待 4. 将所有连接进程放入任务中......它运行良好@bradeyGrainger【参考方案4】:

最后,我根据@MikaalAnwar 的回答找到了确切的答案!

我们不需要在连接字符串中添加任何新选项(如Asynchronous Processing=true);这适用于 SQL 连接,不适用于 MySql。

那么,我们现在应该怎么做呢?

我们将任何被尊重为具有异步选项的 void,async。然后我们添加一个等待任务并运行它(Task.Run)。在该任务中,我们对连接做任何我们想做的事情。

例如:(我们不想使用任何数据集)

private async void DBConnect(String connectionString)

    await Task.Run(() =>
         
            MySqlConnection dbConnection = new MySqlConnection(connectionString);
            dbConnection.Open();
        
    );


& 我们不使用 DBConnection.OpenAsync(),因为 void 是异步的并且我们已经使用 await 来完成任务。

完成:)

【讨论】:

以上是关于MySql Connection 方法是不是支持异步编程?的主要内容,如果未能解决你的问题,请参考以下文章

connection.query 不是一个函数 Node.js MySQL

JS 无法查询 MySQL 数据库。错误:connection.query 不是函数

离线数据同步神器:DataX,支持几乎所有异构数据源的离线同步到MaxCompute

mysql Connection能否用于多次查询,是不是会有安全问题

为啥带有 Mysql2 Gem ActiveRecord::Base.connection.execute(sql) 的 Rails 3 返回 Array 而不是 Hash?

基于Mac——dbeaver连接MySQL数据库错误提示Connection refused