多线程服务中的数据库连接管理

时间:2011-06-03 15:43:53

标签: database vb.net multithreading connection httplistener

我创建了一个监听端口的Windows服务(使用HttpListner)并接受XML Repuest,一旦请求有效,它就连接到数据库(通常在同一台PC上)并构造xml响应并将其发回。 / p>

到目前为止,一切都很棒,除非服务接受两个或多个需要检索100多条记录的请求,否则它会崩溃。首先,我只使用一个与数据库的共享连接,它确实崩溃了,然后我改为多个连接,即当你需要来自数据库的东西时创建你的连接。

我使用eventlog进行了一些故障排除以获取异常,这是我在崩溃之前遇到的一些例外:

从服务器接收结果时发生传输级错误。 (提供者:会话提供者,错误: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

我对列表器或解析请求没有任何问题,我知道我对数据库的交互方式存在问题。

任何建议,谢谢你的时间。

0 个答案:

没有答案