【问题标题】:C# Mysql and multiple threads?C# Mysql 和多线程?
【发布时间】:2011-07-28 22:13:39
【问题描述】:

我正在托管一个使用 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.EnlistTransaction (System.Transactions.Transaction 事务)[0x00000] 在:0
  在 MySql.Data.MySqlClient.MySqlConnection.Open () [0x00000] in :0

【问题讨论】:

    标签: c#


    【解决方案1】:

    每当您需要简单地查询您的 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 为您管理的连接池中,这样您就不会因为创建多个连接而导致速度变慢。此外,这段代码是完全可重入的,因此根据定义线程安全 => 它可以从任意数量的线程并发执行。

    【讨论】:

    • 我不认为为永远查询创建连接是个好主意。
    • @High,这不会为每个请求创建连接。它从 ADO.NET 为您管理的连接池中提取一个。并且在 using 语句的末尾,这个连接被简单地返回到连接池,以便它可以被重用。就性能而言,这将是最快的方式。有关连接池的更多信息,请阅读以下主题:dev.mysql.com/doc/refman/5.0/en/…
    • 啊,谢谢你的信息。不知道连接器是这样工作的。
    • @High,是的,它就是这样工作的。 SQL Server 也以这种方式工作。事实上,当您第一次运行应用程序时,ADO.NET 会创建到数据库的多个连接并将它们存储在连接池中(该池是每个应用程序域的每个连接字符串)。因此,当您编写conn.Open() 时,您并没有打开一个新连接,而是从池中获取一个已经存在的连接,并且在 using 语句结束时,连接将返回到池中。效率很高。
    • 嘿,当我尝试一次打开 2 时,它似乎引发了异常。添加上面的代码/异常。
    猜你喜欢
    • 2012-05-23
    • 2016-12-19
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2011-06-17
    • 1970-01-01
    相关资源
    最近更新 更多