2014-01-24 58 views
1

我有一個windows服務,每10秒鐘定期檢查一次數據庫,檢索尚未發送的郵件並執行待處理郵件的任務。使用帶定時器和sql server的windows服務時發生內存泄露

問題是內存一步一步增加。如果需要調整,請幫助。

我的代碼的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 

回答

0

你有什麼不是資源泄漏,而是推遲資源的定稿,由於垃圾收集的非確定性性質.NET。在您的代碼中創建了不少SqlConnection對象的實例 - 在閱讀器循環中,您爲SELECT查詢結果中的每一行創建一個新連接。您必須確保關閉SqlConnection。 SqlConnection的實例都應該是這樣的:當執行那張Using塊外

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

Using聲明將確保連接被關閉。在MSDN中查看更多詳情。

0

在我的解決方案中,我使用COM3端口將Windows服務連接到調制解調器設備並使用GSMComm庫。

經過幾次測試,我constat,我的問題是不是位於發送郵件功能,但在senidng短信。

服務是穩定的,每一個想的很順利,但服務運行後(COM3端口由服務程序中打開)和設備unplagued突然,服務仍在運行,但存儲一些莫比可能提高到走。

comm = New GsmCommMain(3, 10000, 30000) 

    If comm.IsConnected Then 

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