Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
测试C#MySQL连接池失败,出现异常:连接必须有效且打开_C#_Mysql_Multithreading_Connection Pooling - Fatal编程技术网

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

测试C#MySQL连接池失败,出现异常:连接必须有效且打开,c#,mysql,multithreading,connection-pooling,C#,Mysql,Multithreading,Connection Pooling,我正在尝试使用MySQL的.net connector 6.6.4.0上的连接池,使用以下代码为多个线程提供服务: static public uint uNonQuery(string query) { using (Connection = new MySqlConnection(ConnectionString)) { if (Connection.State == C

我正在尝试使用MySQL的.net connector 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);

}
static void DoInserts(对象o)
{
int i=(int)o;
WriteLine(“插入线程{0}已启动”,i);
对于(int x=0;x<1000;x++)
{
uint insertId=DataLayer.unquery(String.Format(“插入testdb.dbtest(writeNo,strNo)值({0},'x={0}线程={1}')”,x,i));
}
WriteLine(“插入线程{0}已完成”,i);
}
我得到异常异常:连接必须有效且打开。在2个并发线程上插入6次后,是否需要执行其他操作以使池正常工作

感谢您使用(Connection=new MySqlConnection(ConnectionString))

您正在使用变量
Connection
。这个变量是在哪里定义的?它是静态的吗?您应该在
unquery
的范围内定义它。如果变量
Connection
是静态的,则在对
unquery
的新函数调用打开连接后,连接可能会关闭

例如: -线程1调用
unquery
并打开,执行一些操作。 -线程2调用
unquery
,打开连接, -线程1关闭连接 -线程2无法执行其操作,因为连接突然关闭


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

出于兴趣,为什么要检查连接是否打开,然后无论如何打开它???@DanielKelley Hi。我测试了它在调用open()之前是否打开,在调用open()之前是否未打开,这是预期的,尽管连接池已启用。
(Connection.State==ConnectionState.Open
表示代码的逻辑有问题。如果要在作用域中打开连接,则无需检查它是否已打开。您好,连接对象似乎被定义为static,这导致了冲突。我刚刚在没有static的情况下再次测试了它,它完成了20个并发线程,每个线程插入10000个。非常感谢。