C#应用程序创建了许多连接线程,MySQL

时间:2015-04-06 12:47:06

标签: c# mysql multithreading

我的C#应用​​程序导致至少2-3个连续的线程连接'根据MySQL客户端连接' Workbench中的选项卡。我仍然无法理解为什么会这样,即使在解密执行查询的并行线程之后,我也只能连续连接线程'从4下降到2-3。

我甚至检查了在执行查询后是否未能关闭连接,无法找到缺少的connection.close()。无论如何不会确定它。我检查了一般日志文件,我只能找到' connect'实例但不是单一的' kill / close'实例。

此外,根据MySQL客户端连接中的命令字段'标签

  • 线程号1 :休眠1秒钟,然后恢复为0。
  • 线程编号2 :睡眠30秒,然后恢复为0.

我可以理解线程号2 ,因为我有一个定时器,每30秒触发一次并在其中运行查询。

注意:计时器30秒事件是我运行查询的唯一地方,而常规日志文件也与此协作。

但是,我无法理解为什么会创建2或3个连续连接线程。

编辑(我使用的典型代码)

internal bool id_exists(int id)  
    {
        bool to_return = false;
        string myconnection = "datasource=localhost;port=3306;username=root;password=root";
        MySqlConnection myConn = new MySqlConnection(myconnection);     //Connect to MySql

        string Query = " SELECT * FROM database.table;";
        MySqlCommand cmdDatabase = new MySqlCommand(Query, myConn);     //Command for the database

        MySqlDataReader myReader;
        try
        {
            myConn.Open();
            myReader = cmdDatabase.ExecuteReader();

            while (myReader.Read())
            {
                if (myReader.IsDBNull(myReader.GetOrdinal("id"))) { continue; }
                if (myReader.GetInt32("id") == pre_id) { to_return = true; break; }
            }
        }
        catch (MySqlException ex)
        {
            //Incase case of exception
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error 5: " + ex.Message + "\n\nError loc: " + this.GetType().Name + " : " + System.Reflection.MethodBase.GetCurrentMethod().Name + "\n\nStack Trace:\n" + ex.StackTrace);
        }
        myConn.Close();
        return to_return;
    }

第二次编辑:正如@PanagiotisKanavos所说,ADO.Net有连接池,导致创建许多连接线程。最有可能的连接字符串变化是创建多个连接线程的罪魁祸首。

我尝试按照此MySQL Connection will not close链接添加Pooling = False,现在最多只有一个连接线程在我运行C#app时出现。我甚至注意到,与Pooling = True相比,性能已经恶化。

现在,如果有人能澄清以下疑问,那将会非常有帮助: 由于我需要使用不同的连接字符串,并且Connection Pooling正在创建许多连接线程,因此在同时在不同计算机上使用C#app时,它有助于立即达到max_connection限制。

是否还有其他解决方案可以保持连接池,同时避免超过max_connection限制?

1 个答案:

答案 0 :(得分:0)

而不是:

MySqlConnection myConn = new MySqlConnection(myconnection);

使用"使用"子句:

using (MySqlConnection myConn = new MySqlConnection(myconnection))
{
...
}

使用" myConn.Close()"的结束括号到位线。

我不确定它会解决您的问题,但它会更好地编码。什么"使用"无论是否存在异常,语句都会关闭并在退出使用时处置连接。

每当你使用一个实现IDispose的类时,比如SqlConnection类,你应该总是使用"使用"声明,以确保在完成对象时正确处理对象。