NPGSQL选择查询间歇性地不返回任何行

时间:2012-07-17 23:39:36

标签: postgresql ado.net npgsql

我正在运行一个简单的选择查询:

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, 布拉德

1 个答案:

答案 0 :(得分:4)

您是否在多个线程之间共享连接?与其他数据提供程序一样,Npgsql不是线程安全的。我认为这是你问题最可能的原因。您应该打开一个连接,使用它然后关闭它。这是使用连接池时最具扩展性的模式。我希望它有所帮助。