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

Другие вопросы по тегам