2

したがって、単純な選択クエリを実行しています:

Private Function ReturnTableQuery(ByVal SQL As String) As DataTable

    Dim rs As DataTable = New DataTable
    Dim Adapter As NpgsqlDataAdapter = New NpgsqlDataAdapter

    Try
        If conn Is Nothing Then
            ConnectDatabase()
        End If
        If conn.State <> ConnectionState.Open Then
            ConnectDatabase()
        End If
        Adapter.SelectCommand = New NpgsqlCommand(SQL, conn)
        Adapter.SelectCommand.CommandTimeout = 10
        Adapter.Fill(rs)
    Catch ex As Exception
        PreserveStackTrace(ex)
        Throw ex
    End Try

    Return rs

End Function

SQL コマンドは次のとおりです。

Select id, application, datetimestamp, status, data, attemptcount from queue where application='reportengine' and status=4 and datetimestamp <= now()  order by datetimestamp limit 1

0 行が返されることがあります。

プログラムで失敗しているときに pgAdmin でまったく同じクエリを実行すると、期待どおりの行が返されます。

接続を閉じて再度開くと機能しますが、接続に問題があるかどうかを事前に判断できません。

毎回接続を再開することもできますが、必要な頻度で接続を再作成したくありません。

また、「不明なサーバー応答」などの断続的なエラーが発生し、これをキャッチして接続を再開しています。

接続が非常に壊れやすい理由と、実際の接続状態を確認するための安価な方法はありますか?

Thx、ブラッド

4

1 に答える 1

7

複数のスレッド間で接続を共有していますか? Npgsql は、他のデータ プロバイダーと同様に、スレッド セーフではありません。これがあなたの問題の最も可能性の高い原因であるとランク付けします. 接続を開き、使用してから閉じる必要があります。接続プールを使用する場合、これが最もスケーラブルなパターンです。お役に立てば幸いです。

于 2012-07-18T15:46:31.120 に答える