我正在托管一个使用 mysql 连接器的 WCF 服务。由于某种原因,每 5-10 分钟一次,我收到一条错误消息,指出 mysql 已在使用中。我应该怎么办?将其设置为阻塞,让它为每个线程创建一个新连接或设置一个管理器,该管理器创建一定数量的连接并将阻塞直到连接可用。实际上异步调用已经完成了最后一部分吗?最后,阻塞直到另一个线程完成并从该线程获取信息的最佳方法是什么?
public static int Query(this IDbConnection olddb, string query, params object[] args)
{
using (var db = olddb.CloneEx())
{
db.Open();
using (var com = db.CreateCommand())
{
com.CommandText = query;
for (int i = 0; i < args.Length; i++)
com.AddParameter("@" + i, args[i]);
return com.ExecuteNonQuery();
}
}
}
Unhandled Exception: System.NotImplementedException: The requested feature is not implemented. at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in :0 at MySql.Data.MySqlClient.MySqlConnection.Open () [0x00000] in :0
最佳答案
每当您需要简单地查询 SQL 服务器时:
using (var conn = new MySqlConnection("Some connection string"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT foo FROM bar";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
// process the results
}
}
}
这确保连接返回到 ADO.NET 为您管理的连接池中,这样您就不会冒创建多个连接的风险,这可能会减慢速度。此外,此代码是完全可重入的,因此根据定义是线程安全的 => 它可以从任意多个线程并发执行。
关于C# Mysql 和多线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6866421/