连接时出错:超时已过期.从池中获取连接之前经过的超时时间
本文关键字:连接 超时 时间 获取 经过 出错 过期 | 更新日期: 2023-09-27 17:57:54
公共无效队列(对象e){尝试{DataChangeEventArgs e113=(DataChangeEventArgs)e;resetdatasource();for(i=0;i<;e113.st.Length;i++){int hour113=e113.st[i].TimeStampNet.Hoor;int minute113=e113.st[i].TimeStampNet.Minute;int second113=e113.st[i].TimeStampNet.Second;int毫秒113=e113.st[i].TimeStampNet.Millisecond;int year113=e113.st[i].TimeStampNet.Year;int month113=e113.st[i].TimeStampNet.Month;int day113=e113.st[i].TimeStampNet.Day;DateTime sdate113=新的DateTime(年113、月113、天113、小时113、分钟113、秒113、毫秒113);DataRow row1=dt。NewRow();row1["itemID"]=e113.st[i].HandleClient;row1["paramvalue"]=转换。ToString(e113.st[i].DataValue);row1["date_loged1"]=sdate113.ToString("dd-MM-yyyy HH:MM:ss.fff");row1["质量"]=e113.st[i].质量;row1["date_logd"]=DateTime.FromFileTime(e113.st[i].TimeStamp);dt。Rows.Add(第1行);}var threadupdate=新线程(更新)//启动新线程&实例线程更新。Start(dt);}捕获{}}公共void更新(对象dtnew){尝试{MySqlConnection con=新MySqlConnection(LocalConnection.GetLocalConnationStringmysql());DataSet oldvalueds=新DataSet();DataTable newupdateddata=新DataTable();MySqlDataAdapter da;MySqlTransaction trans;if(con.State==ConnectionState.Closed)con.Open()//引发异常trans=con.BeginTransaction();da=新MySqlDataAdapter();da.InsertCommand=新MySqlCommand("INSERT INTO参数(itemID,paramvalue,date_loged1,Quality,date_log)"+"VALUES(@itemID,@paramvalue,@date_loged1,@Quality,@date_Loged)""关于重复密钥更新"+"itemID=值(itemID),paramvalue=值(paramvalue),date_loged1=值(date_logedd1),Quality=值(Quality),date_logged=值(date _logged)";,con);da.InsertCommand.Parameters.Add("@itemID",MySqlDbType.VarChar,250,"itemID");da.InsertCommand.Parameters.Add("@paramvalue",MySqlDbType.VarChar,250,"paramvalue");da.InsertCommand.Parameters.Add("@date_loged1",MySqlDbType.VarChar,250,"date_logedd1");da.InsertCommand.Parameters.Add("@Quality",MySqlDbType.VarChar,250,"Quality");da.InsertCommand.Parameters.Add("@date_loged",MySqlDbType.VarChar,250,"date_logd");da.InsertCommand.Transaction=trans;DataTable newupdateddt=(DataTable)dtnew;int k=da.Update(newupdateddt)//第2次引发异常trans。Commit();con.Close();}catch(异常ex){}最后{}}
它将抛出一个异常,如"error connection:Timeout expired。从池中获取连接之前经过了超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。"
我将在连接字符串中设置timeout=200这个异常被抛出"尝试获取锁定时发现死锁;尝试重新启动事务"提前感谢
您正在设置一个开放连接等,但没有处理它。我实际上不清楚为什么,因为这都是为适配器(da
)准备的,而您实际上似乎并没有使用。但是:一般来说,您应该在所有这样的(IDisposable
)对象周围使用using
:
using(var con = new MySqlConnection(...))
{
... all the code that uses the connection here ...
}
这确保了对象被干净而快速地释放——将底层连接放回池中。这同样适用于实现IDisposable
的任何其他对象——例如,可能也是事务。
出现此错误的原因可能是所有连接都在使用中,并且已达到最大池大小。尝试增加连接字符串中的Pool Size
,例如Max Pool Size = 100
。