2015-01-21 89 views
0

我正在写一个数据库类,使用c#与多线程sdk进行交互。我应该只使用一个连接(不需要说!)但是,我总是会收到有关连接和数据收集器的错误。帮助表示赞赏。c#mysqlreader多线程失败

这里是我的代码

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

什么是错误_exactly_? – 2015-01-21 07:49:53

+0

1.复制内存时检测到可能的I/O争用情况,2.存在已打开的连接。 3.连接必须有效并打开。 – fatih 2015-01-21 07:53:44

+0

为什么你用静态的东西?为每个线程提供一个实例? – 2015-01-21 07:56:39

回答

0

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

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