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.OpenAsync
、MySqlCommand.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?