我的C#应用程序导致至少2-3个连续的线程连接'根据MySQL客户端连接' Workbench中的选项卡。我仍然无法理解为什么会这样,即使在解密执行查询的并行线程之后,我也只能连续连接线程'从4下降到2-3。
我甚至检查了在执行查询后是否未能关闭连接,无法找到缺少的connection.close()。无论如何不会确定它。我检查了一般日志文件,我只能找到' connect'实例但不是单一的' kill / close'实例。
此外,根据MySQL客户端连接中的命令字段'标签
我可以理解线程号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限制?
答案 0 :(得分:0)
而不是:
MySqlConnection myConn = new MySqlConnection(myconnection);
使用"使用"子句:
using (MySqlConnection myConn = new MySqlConnection(myconnection))
{
...
}
使用" myConn.Close()"的结束括号到位线。
我不确定它会解决您的问题,但它会更好地编码。什么"使用"无论是否存在异常,语句都会关闭并在退出使用时处置连接。
每当你使用一个实现IDispose的类时,比如SqlConnection类,你应该总是使用"使用"声明,以确保在完成对象时正确处理对象。