测试C#MySQL连接池失败,出现异常:连接必须有效且打开

时间:2013-02-07 20:09:02

标签: c# mysql multithreading connection-pooling

我正在尝试在MySQL的.net连接器6.6.4.0上使用连接池来使用以下代码服务多个线程:

static public uint uNonQuery(string query)
        {

                using (Connection = new MySqlConnection(ConnectionString))
                {
                    if (Connection.State == ConnectionState.Open)
                    {
                        Console.WriteLine("Its open..>!!!!");
                    }

                    Connection.Open();

                    MySqlCommand cmd = new MySqlCommand(query, Connection);
                    cmd.ExecuteNonQuery();


                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT LAST_INSERT_ID() AS 'identity'", Connection);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    uint ret = 0;

                    if (dt.Rows.Count > 0)
                    {
                        try
                        {
                            ret = Convert.ToUInt32(dt.Rows[0]["identity"]);
                        }
                        catch
                        {
                            ret = 0;
                        }
                    }

                    else
                        ret = 0;

                    Connection.Close();
                    return ret;
                }
        }

我的连接字符串是

"server = 127.0.0.1; user id = ****; password = ****; database = testdb; pooling=true; maximumpoolsize=500;"

用于测试的线程是

static void DoInserts(object o)
{
    int i = (int)o;
    Console.WriteLine("Insert Thread {0} launched", i);


    for(int x = 0; x < 1000; x++)
    {
        uint insertId = DataLayer.uNonQuery(String.Format("INSERT INTO testdb.dbtest (writeNo,strNo) VALUES ({0},'x={0} thread={1}')", x, i));
    }

    Console.WriteLine("Insert Thread {0} completed", i);

}

我得到异常异常:连接必须有效并且打开。在2个并发线程上大约6次插入之后,还有什么我需要做的才能使池能够正常工作吗?

由于

1 个答案:

答案 0 :(得分:1)

在您的第using (Connection = new MySqlConnection(ConnectionString))行中,您使用的是变量Connection。这个变量定义在哪里?它是静态的吗?您应该在uNonQuery的范围内定义它。如果变量Connection是静态的,那么在对uNonQuery的新函数调用打开它之后,可能会关闭连接。

实施例: - 线程1调用uNonQuery并打开,做到了。 - 线程2调用uNonQuery,打开连接, - 线程1关闭Connection - 线程2无法做到这一点,因为连接突然关闭。

如果以上不是问题的原因,我需要更多代码来检查问题。