Управление подключением к базе данных в многопоточном сервисе - PullRequest
2 голосов
/ 03 июня 2011

Я создал службу Windows, которая прослушивает порт (используя HttpListner) и принимает XML Repuest, и после того, как запрос действителен, он подключается к базе данных (обычно на том же компьютере), создает ответ xml и отправляет его обратно.

Пока все отлично, кроме тех случаев, когда служба принимает два или более запросов, требующих получения более 100 записей, происходит сбой.Сначала я использовал только одно общее соединение с базой данных, оно аварийно завершало работу, затем я переключился на несколько соединений, т. Е. Когда вам нужно что-то из базы данных создать ваше соединение.исключения, вот некоторые из исключений, которые я получил перед сбоем:

Произошла ошибка транспортного уровня при получении результатов с сервера.(поставщик: поставщик сеанса, ошибка: 19 - физическое соединение не используется)

Свойство ConnectionString не было инициализировано.

ExecuteReader требуетсяоткрытое и доступное соединение.Текущее состояние соединения - соединение.

ExecuteReader требует открытого и доступного соединения.Текущее состояние соединения открыто .

Недопустимая попытка вызова Read, когда устройство чтения закрыто.

Вот пример кода, который я использую:

 Private Sub StartLisitng()
    MyListener.Start()
    Dim result As IAsyncResult
    result = MyListener.BeginGetContext(New AsyncCallback(AddressOf ListnerCallback), MyListener)
End Sub

    Private Sub ListnerCallback(ByVal result As IAsyncResult)
    StartLisitng()
    If result.IsCompleted Then
        ctx = MyListener.EndGetContext(result)
        Dim HandleRequestThread As New Thread(AddressOf New HandleRequest(ctx).RequestProcess)
        HandleRequestThread.Start()

    End If
End Sub

   Public Function RemoteConnect(ByVal DNSBranch As String) As Boolean
    Dim IsRemoteConnected As Boolean = False
    RemoteConnString = "Data Source = " & DNSBranch & ";Initial Catalog=xxxxx;User ID=xxxxx;Password=xxxxx;Connect Timeout=5;MultipleActiveResultSets=True;"

    RemoteConn = New SqlConnection(RemoteConnString)
    Try
        RemoteConn.Open()
    Catch ex As Exception
        IsRemoteConnected = False
    End Try

    If RemoteConn.State = 1 Then
        IsRemoteConnected = True
    Else
        IsRemoteConnected = False
    End If

    Return IsRemoteConnected

End Function

Public Function RemoteExeComd(ByVal DNSBranch As String, ByVal query As String) As DataSet

    Dim MyDataSet As New DataSet
    RemoteConnect(DNSBranch)

    Comd = New SqlCommand(query, RemoteConn)
    Adapter = New SqlDataAdapter(Comd)

    If query.StartsWith("Se") Or query.StartsWith("se") Or query.StartsWith("SE") Then
        If RemoteConn.State = ConnectionState.Open Then
            Try
                Adapter.Fill(MyDataSet)
            Catch ex As Exception
                EventLog.WriteEntry("My Service", "Exception: " & ex.Message.ToString)
            End Try
        End If
    Else
        Try
            Comd.ExecuteNonQuery()
        Catch ex As Exception
            EventLog.WriteEntry("My Service", "Exception: " & ex.Message.ToString)
        End Try
    End If

    Comd.Dispose()
    Adapter.Dispose()

    Return MyDataSet
End Function

У меня нет проблем со списком или разбором запроса, я знаю, что у меня проблема с тем, как я взаимодействую с базой данных.

Любой совет, Спасибо за ваше время.

...