我正在尝试在一小时内执行3次数据库相关操作。
1:每隔一分钟检查特定时间
2:每15分钟后更新一次特定记录
3:每60分钟后更新一次特定记录
直到15分钟一切都很好......但是在15分钟内,2个计时器必须同时访问数据库。所以这就是为什么它给我看错了。 Connection is already Open
。现在60分钟后,所有三个Timer同时访问数据库,这就是为什么它会再次显示消息Connection is Already Open
。 60分钟后一切正常,直到15分钟。但接下来的15分钟将到来。消息将再次可见,依此类推。这是Timer
定时器1:
_Timer = new Timer();
this._Timer.Interval = 1000 * 60 * 1;
this._Timer.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer_Tick);
_Timer.Enabled = true;
这是_Timer_Tick方法
CheckConnnectionStatus();
string cGroupQuery = "select value from settings where id=1 ";
try
{
sqlConnection.Open();
sqlCommand = new SqlCommand(cGroupQuery, sqlConnection);
sqlDataReader = sqlCommand.ExecuteReader();
if (sqlDataReader.Read())
{
string value= sqlDataReader[0].ToString();
if (value== "True")
{
Library.WriteErrorLog("System State Done Successfully");
TakeSystemState();
UpdateSystemState();
}
}
}
catch (Exception exp)
{
Library.WriteErrorLog(exp.Message.ToString() + " | Exception in CheckPrayerTime");
}
finally
{
CheckConnnectionStatus();
}
定时器2:
_Timer02 = new Timer();
this._Timer02.Interval = 1000 * 60 * 15;
this._Timer02.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer02_Tick);
_Timer02.Enabled = true;
定时器3:
_Timer03 = new Timer();
this._Timer03.Interval = 1000 * 60 * 60;
this._Timer03.Elapsed += new System.Timers.ElapsedEventHandler(this._Timer03_Tick);
_Timer03.Enabled = true;
任何人都可以指导我在Web服务中的Timer中执行这三项操作的最佳方法
我使用的是Sql Server 2008R2 Express Edition
由于
答案 0 :(得分:1)
根据文档,如果连接已打开,SqlConnection.Open()
方法将抛出InvalidOperationException
。有关详细信息,请参阅:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.open(v=vs.110).aspx
作为一种解决方案,您可以在每个SqlConnection
事件处理程序方法中创建一个新的Timer
对象,并在完成处理后创建Dispose()
。
将新创建的SqlConnection
对象放在using
语句中是一种很好的做法,这样即使抛出异常也会释放连接:
using (var conn = new SqlConnection())
{
conn.Open();
// ...
}