【问题标题】:Testing C# MySQL connection pooling fails with Exception: Connection must be valid and open测试 C# MySQL 连接池失败并出现异常:连接必须有效且打开
【发布时间】:2013-01-23 11:32:24
【问题描述】:

我正在尝试使用 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 次插入后,我还需要做些什么才能使池正常工作吗?

谢谢

【问题讨论】:

  • 出于兴趣,你为什么要检查连接是否打开然后不管它打开它??
  • @DanielKelley 你好。我在调用 Open() 之前测试了它是否打开,并且在 Open() 调用之前它没有打开,这是预期的,尽管启用了连接池。
  • (Connection.State == ConnectionState.Open 表示您的代码逻辑有问题。如果要在范围内打开连接,则无需检查它是否已打开。

标签: c# mysql multithreading connection-pooling


【解决方案1】:

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

示例: - 线程 1 调用 uNonQuery 并打开,做事。 - 线程 2 调用uNonQuery,打开连接, - 线程 1 关闭 Connection - 由于连接突然关闭,线程 2 无法正常工作。

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

【讨论】:

  • 您好,似乎 Connection 对象被定义为静态,这导致了冲突。我只是在没有静态的情况下再次测试它,它完成了 20 个并发线程,每个线程有 10 000 次插入。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多