使用带有计时器和SQL Server的Windows服务时内存泄漏

时间:2014-01-24 13:59:17

标签: memory-leaks timer windows-services

我有Windows服务,每10秒定期检查一次数据库,检索尚未发送的邮件并执行待处理邮件的任务。

问题是内存逐步增加。如果需要任何调整,请提供帮助。

我的代码visual basic:

Private Sub TimerMail_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles TimerMail.Elapsed
    Dim SqlConnection As New SqlConnection("Data Source=.;Initial Catalog=xxx;Integrated Security=True")
    Dim cmd As New System.Data.SqlClient.SqlCommand
    cmd.CommandType = System.Data.CommandType.Text
    cmd.CommandText = "SELECT DISTINCT UserName, objet, contenu, email FROM message WHERE envoimail='false'"
    SqlConnection.Open()
    cmd.Connection = SqlConnection
    Dim monReader As SqlDataReader = cmd.ExecuteReader()


    While monReader.Read
        Try
            EnvoiMail(monReader("objet"), monReader("contenu"), monReader("email"), mailport, serveur, username, password, True)
            Dim SqlConnection2 As New SqlConnection("Data Source=.;Initial Catalog=CGP;Integrated Security=True")
            Dim cmd2 As New System.Data.SqlClient.SqlCommand
            cmd2.CommandType = System.Data.CommandType.Text
            cmd2.CommandText = "UPDATE destinataire SET envoimail='true' WHERE UserName='" & monReader("UserName") & "'"
            SqlConnection2.Open()
            cmd2.Connection = SqlConnection2

            cmd2.ExecuteNonQuery()

        Catch ex As Exception
            logger.Error(ex.Message)
        End Try

        Threading.Thread.Sleep(60000)
    End While
End Sub

2 个答案:

答案 0 :(得分:0)

由于.Net中垃圾收集的非确定性,您所拥有的不是资源泄漏,而是延迟资源的最终确定。在您的代码中创建了很多SqlConnection对象实例 - 在reader循环中,您为SELECT查询结果中的每一行创建一个新连接。您必须确保关闭SqlConnection。 SqlConnection的每个实例应如下所示:

Using connection As New SqlConnection(connectionString)
    connection.Open()
    ' Do work here; connection closed on following line.
End Using 

Using语句将确保在执行超出Using块时关闭连接。请参阅MSDN中的详细信息。

答案 1 :(得分:0)

在我的解决方案中,我使用COM3端口将Windows服务连接到调制解调器设备并使用GSMComm库。

经过多次测试后,我认为我的问题不在于发送邮件功能,而是在senidng短信中。

服务稳定,每一个想法都进展顺利,但是在服务运行后(服务程序打开COM3端口)和设备突然停止运行,服务仍在运行,但内存可能从一些Mo增加到超过Go

    comm = New GsmCommMain(3, 10000, 30000)

    If comm.IsConnected Then

        If comm.IsOpen Then
            '------------
        Else
            Me.Stop()
        End If
    Else
        Me.Stop()
    End If