我正在运行一个简单的选择查询:
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, 布拉德
答案 0 :(得分:4)
您是否在多个线程之间共享连接?与其他数据提供程序一样,Npgsql不是线程安全的。我认为这是你问题最可能的原因。您应该打开一个连接,使用它然后关闭它。这是使用连接池时最具扩展性的模式。我希望它有所帮助。