c# mysqlreader 多线程失败

c# mysqlreader multithread fail

我正在使用与多线程 sdk 交互的 c# 编写数据库 class。我应该只使用一个连接(不用说!)但是,我总是收到关于 connection 和 datareaders 的错误。感谢 Anly 的帮助。

这是我的代码结构

static class Db
{
  static MySqlConnection conn = new MySqlConnection(connectionString);

  private static void Connect()
  {
    if (conn.State == ConnectionState.Closed)
                    conn.Open();
  }

   private static void DisConnect()
   {
     if (conn.State == ConnectionState.Open)
     conn.Close();
    }  


    static int Insert()
    {
        Connect();
        MySqlCommand cmd = new MySqlCommand(sql, conn);
        cmd.ExecuteNonQuery();
        return Convert.ToInt32(cmd.LastInsertedId);
        DisConnect();
    }

     public static DataTable select(string sql) //Especially fails here
     {
         Connect();
         MySqlCommand cmd = new MySqlCommand(sql, conn);
         using (MySqlDataReader read = cmd.ExecuteReader())
         {
             if (read.HasRows){ Some Code... }
         }
         DisConnect();
     }
  }

请注意,不保证 MySqlConnection 实例是线程安全的。您应该避免同时在多个线程中使用相同的 MySqlConnection。建议为每个线程打开一个新连接,并在工作完成后关闭它。实际上,每次使用 Pooling=true 时连接都不会 created/disposed;连接字符串选项 - 连接将存储在连接池中。这大大提高了性能。

我还建议在创建连接时使用 'using' 子句,这样它会自动 disposed/closed 并返回到连接池。