C#Mysql和多线程?

时间:2011-07-28 22:13:39

标签: c#

我正在托管使用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

1 个答案:

答案 0 :(得分:11)

每当您需要简单地查询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为您管理的连接池中,从而不会产生任何可能导致速度变慢的连接的风险。此代码也是完全可重入的,因此根据定义,thread safe =&gt;它可以从你想要的多个线程中同时执行。