Запрос выбора 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, когда он не выполняется в моей программе, он возвращает строку, как и ожидалось.
Если я закрываю и заново открываю соединение, оно работает, но я не могу определить, есть ли что-то не так с соединением заранее.
Я мог бы просто заново открывать соединение каждый раз, но я бы предпочел не воссоздавать соединение так часто, как мне было бы нужно.
Я также получаю периодические ошибки, такие как "неизвестный ответ сервера", которые я перехватываю и заново открываю соединение.
Есть идеи, почему соединение настолько хрупкое и есть недорогой способ проверить фактическое состояние соединения?
Спасибо, бред
1 ответ
Вы разделяете ваше соединение между несколькими потоками? Npgsql, как и другие поставщики данных, не является потокобезопасным. Я бы назвал это наиболее вероятной причиной ваших проблем. Вы должны открыть соединение, использовать его, а затем закрыть его. Это самый масштабируемый шаблон при использовании пула соединений. Я надеюсь, что это помогает.