gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:38:12 26 4
gpt4 key购买 nike

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

我什至检查了执行查询后是否无法关闭连接,但找不到丢失的connection.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具有连接池,这会导致创建许多连接线程。连接字符串的变化很可能是创建多个连接线程的罪魁祸首。

我尝试按照此添加 Pooling = False MySQL Connection will not close链接,现在当我运行 C# 应用程序时,最多只有一个连接线程出现。我什至注意到,与 Pooling = True 相比,性能有所下降。

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

是否有任何其他解决方案可以让我保持连接池,同时避免过早超出 max_connection 限制?

最佳答案

而不是:

MySqlConnection myConn = new MySqlConnection(myconnection);

使用“using”子句:

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

将右大括号放在“myConn.Close()”行的位置。

我不确定它会解决你的问题,但它会更好的编码。 “using”语句的作用是在退出using时关闭并释放连接,无论是否有异常。

每当您使用实现 IDispose 的类(例如 SqlConnection 类)时,您都应该始终使用“using”语句来确保对象在使用完毕后得到正确处置。

关于C# 应用程序创建许多连接线程,MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29471621/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com