c#mysqlreader多线程失败

时间:2015-01-21 07:48:12

标签: c# multithreading database-connection mysqldatareader

我正在使用与多线程sdk交互的c#编写Database类。我应该只使用一个连接(不需要说!)但是,我总是得到关于连接和datareaders 的错误。非常感谢帮助。

这是我的代码的结构

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();
     }
  }

1 个答案:

答案 0 :(得分:1)

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

我还建议在创建连接时使用'using'子句,以便它自动处理/关闭并返回到连接池。