2012-07-17 51 views
1

我正是如此运行一个简单的选择查询:选择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, 布拉德

回答

4

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

+0

你是对的!这不是我第一个使用npgsql的多线程应用程序,但是这次我确实试图通过共享类共享线程之间的连接。我会重构。 – 2012-07-18 21:14:09