【问题标题】:C# MySQL Connection - MultiThreading - Cannot connectC# MySQL 连接 - 多线程 - 无法连接
【发布时间】:2018-01-21 18:07:53
【问题描述】:

首先一切运行良好。我正在运行一个有 100 个线程的程序,每个线程都在建立数据库连接。一段时间后,我收到以下错误消息:

“无法连接到任何指定的mysql主机”(内部异常: 连接超时)

MySQL 服务器在 Windows 机器上运行 (Win Server 2012)。

我已将mySql连接限制设置为10k,但问题依旧

using (MySqlConnection mConnection = new MySqlConnection(connectionString))
{
        mConnection.Open();

        using (MySqlCommand myCmd = new MySqlCommand("XXX"))
        {
            myCmd.CommandType = CommandType.Text;

            // DO STUFF HERE
            myCmd.Connection.Dispose();
        }

        mConnection.Close();
        mConnection.Dispose();
}

【问题讨论】:

  • 你的连接字符串有问题!你没有发布的
  • 我认为你最好让你的代码异步并允许任务调度程序处理它认为合适的线程。为像数据库调用这样的 I/O 绑定工作创建线程是对线程的浪费。
  • 我以异步方法运行它。该方法由线程池调用
  • 您还在等什么?是Task.Run()吗?仍然消耗一个线程并且不应该用于 I/O 绑定工作。
  • 我在里面等待一个网络请求

标签: c# mysql multithreading asynchronous connection


【解决方案1】:

也许这会解决你的问题:

 using (MySqlConnection mConnection = new MySqlConnection(connectionString))
 {
     using (MySqlCommand myCmd = mConnection.CreateCommand())
     {
         mConnection.Open();
         myCmd.CommandTimeout = 60;
         myCmd.CommandType = CommandType.Text;
         myCmd.CommandText = "XXX";

         using (var reader = cmd.ExecuteReader())
         {
             while (reader.Read())
             {
                 // DO STUFF HERE
             }
         }
     }
 }

您可以根据需要设置超时值(请注意,因为超时以秒为单位而不是毫秒)。

如果您使用的是using () { ... },也不需要使用.Close().Dispose()

编辑:根据下面的 cmets 更新了答案。

【讨论】:

  • ConnectionTimeout 是只读的。我需要处理和关闭,因为 mysql 使用连接池。在这种情况下使用是没有用的。
  • 连接字符串正确。此错误仅在一段时间后发生。意味着在我成功连接之前!
  • @CarlosSantos using 已经为您处理了,将其包含在using 块中然后调用 Close() 和 Dispose() 是多余的,后者调用 Close( ) 本身。但这根本不是您的问题的原因。
  • 是的,这并没有真正帮助我:(但相信我,如果我在使用结束时不处理连接,连接将不会关闭。我已经测试过这个......我有很多打开连接。通常你是对的,但在这种情况下,使用的行为不像正常
  • @CarlosSantos 我不知道你的意思是什么,using 块不可能不处理连接和命令。并且连接实际上并没有在服务器上关闭,“关闭”一个连接只是返回一个到池的打开连接,因此它可以有效地用于下一个 MySqlConnection。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 1970-01-01
相关资源
最近更新 更多