我有一个数据库调用需要每小时进行一次,并且已经实现了System.Timers.Timer类来执行调用。问题是,一旦计时器完成并执行其回调(无论是2分钟还是1小时),系统拒绝打开数据库连接,引用对象引用未设置为对象错误的实例,尽管首次通过Web服务调用方法时,或者在需要DB并且可以访问它的任何其他站点函数下,数据库连接方法正常工作。
计时器运行时我的课程是否被垃圾收集?
我的IIS配置中是否缺少特定设置以允许Timer回调事件在没有用户特定输入的情况下打开数据库连接?
我是否疯了,自动每小时数据库调用执行不力?
仅供参考,该网站是作为代码隐藏运行时编译站点实现的。
Public Shared noticeTimer As Timer
<WebMethod()> _
Public Shared Function GetOpenDegrades()
Dim dbCon As OleDbConnection = DbConnection()
Dim sql As String = "SELECT XYZ"
'Init sql command
Dim cmd As New OleDbCommand(sql, dbCon)
'Execute query
Dim rdr As OleDbDataReader = cmd.ExecuteReader()
'Add query results to list
If rdr.HasRows Then
While rdr.Read()
.........
End While
End If
rdr.Close()
dbCon.Close()
System.Threading.Thread.Sleep(5000)
If (noticeTimer Is Nothing) Then
noticeTimer = New Timer()
noticeTimer.Interval = 120000 '2 mins for testing 1 hour for production
noticeTimer.enabled = True
noticeTimer.AutoReset = True
AddHandler noticeTimer.Elapsed, AddressOf GetOpenDegrades
Else
'Timer Adjustment if required
........
End If
End Function
//db connection helper function
Public Shared Function DbConnection() As OleDbConnection
Dim path As String = System.Web.HttpContext.Current.Server.MapPath("..\db\db.accdb")
Dim dbCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ path)
dbCon.Open()
Return dbCon
End Function
答案 0 :(得分:1)
您的代码有很多问题:
Shared
。事实上,我很惊讶它可以作为一个Web服务操作。Shared
个资源。您的代码会创建实现IDisposable
接口的各种对象。这些应该在Using
块内创建和使用:
Dim sql As String = "SELECT XYZ"
'Init sql command
Using dbCon As OleDbConnection = DbConnection()
Using cmd As New OleDbCommand(sql, dbCon)
'Execute query
Using rdr As OleDbDataReader = cmd.ExecuteReader()
'Add query results to list
If rdr.HasRows Then
While rdr.Read()
.........
End While
End If
End Using
End Using
End Using
' Don't need the Close calls since the end of the Using blocks will do that