c# Mysql和多线程

本文关键字:多线程 Mysql | 更新日期: 2023-09-27 18:03:57

我正在托管一个使用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();
        }
    }
}
未处理的异常:System。NotImplementedException:请求的特性没有实现。MySql.Data.MySqlClient.MySqlConnection.EnlistTransactionTransaction Transaction) [0x00000] in:0at MySql.Data.MySqlClient.MySqlConnection.Open () [0x00000] in:0

c# Mysql和多线程

每次您需要查询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为您管理,这样您就不会有创建多个连接的任何风险,这可能会减慢速度。此外,这段代码是完全可重入的,因此根据定义线程安全=>它可以从您希望的任意多个线程并发执行。