我的C#应用程序导致至少2-3个连续的“线程连接”,如工作台中的MySQL客户端连接选项卡。我仍然无法理解为什么,即使在解冻了执行查询的并行线程之后,我也只能将连续的“连接”线程从4降到2-3。
我甚至检查了执行查询后是否未能关闭连接,找不到缺少的connection.close()。无论如何都不会确定的。我检查了一般日志文件,我只能找到“connect”实例,而不是一个“杀死/关闭”实例。
此外,根据MySQL客户端连接选项卡中的命令字段
我可以理解线程2号,因为我有一个计时器,它每30秒触发一次,并在其中运行查询。
注意: Timer 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;
}第二版编辑:As @PanagiotisKanavos说ADO.Net有连接池,这会导致创建许多连接线程。很可能,连接字符串的变化是创建多个连接线程的罪魁祸首。
我试着按照这个MySQL Connection will not close链接添加合用= False,现在在运行C#应用程序时,最多只有一个连接线程。我甚至注意到,与合用= True相比,性能下降了。
现在,如果有人能够澄清以下疑问,这将是非常有帮助的:因为我需要有不同的连接字符串,而且连接池正在创建许多连接线程,所以当同时在不同的机器上使用C#应用程序时,它有助于在任何时候达到C#限制。
还有什么其他解决方案可以让我保持连接池,同时避免过快超过max_connection限制吗?
发布于 2015-04-06 13:19:03
而不是:
MySqlConnection myConn = new MySqlConnection(myconnection);使用“使用”子句:
using (MySqlConnection myConn = new MySqlConnection(myconnection))
{
...
}用大括号代替"myConn.Close()“行。
我不确定它能解决你的问题,但它会是更好的编码。" using“语句所做的是关闭并在退出使用时释放连接,而不管是否存在异常。
当您使用实现IDispose的类(如SqlConnection类)时,应该始终使用“使用”语句,以确保在处理完该对象时,该对象得到正确的处理。
https://stackoverflow.com/questions/29471621
复制相似问题