PostgreSQL JDBC ResultSet имеет в 4 раза больше ожидаемых строк при сканировании одной таблицы

Я запускаю Tomcat 9.0 с базой данных PostgreSQL 10.2, используя пул JDBC Tomcat, настроенный с помощью org.postgresql.Driver.

У меня есть следующий простой запрос, который просматривает небольшую справочную таблицу для значений:

SELECT DISTINCT quality_rank, quality_desc 
  FROM flooring_quality_type 
ORDER BY quality_rank

В таблице ровно 3 строки, и инструмент запросов pgAdmin возвращает те же самые 3 строки независимо от используемого ключевого слова DISTINCT.

Я использую SQL в следующем коде, чтобы добавить значения в список (в настоящее время не использую столбец rank, до того, как я использовал putIfAbsent с картой, чтобы обойти ошибку).

String QUALITIES_SQL = "SELECT DISTINCT quality_rank, quality_desc " + 
    " FROM flooring_quality_type ORDER BY quality_rank";

try (Connection con = DataSourceKeeper.getConnection();
     PreparedStatement mapStmt = con.prepareStatement(PRICE_MAP_SQL); // Another query, not exhibiting problem
     PreparedStatement qualStmt = con.prepareStatement(QUALITIES_SQL)) {

    try (ResultSet qualRs = mapStmt.executeQuery()) {
        while (qualRs.next()) {
            System.out.println("Got another result");
            qualities.add(qualRs.getString("quality_desc"));
        }
    }

    // Other query executed here ... SNIP
    // The mapStmt does not cause the same issue, but uses joins.
    // Problem occurs regardless of the order of statement execution.

} catch (SQLException e) {
    throw new UserFacingException();
}

Я смотрю на вывод списка в формате JSON, а также на печатное сообщение. Хотя в таблице 3 строки, я вижу 12 записей. Они упорядочены в нечеткие группы по 3, как если бы запрос повторялся 4 раза по порядку, возвращаясь к одному и тому же ResultSet.

Любая идея, что может быть причиной этого и как это решить? Я делаю что-то не так с кодом JDBC?


person dtgman    schedule 19.02.2018    source источник
comment
Следует отметить, что DataSourceKeeper просто хранит источник данных, полученный через JNDI.   -  person dtgman    schedule 20.02.2018
comment
Вместо того, чтобы публиковать дополнительные комментарии, вы можете отредактировать свой вопрос, если хотите добавить подробности.   -  person Devstr    schedule 20.02.2018
comment
Может ли весь код выполняться несколько раз? Вы используете несколько потоков? Я рекомендую разделить ваш код только на этот запрос и проверить содержимое качеств var. Отладчик тоже может помочь.   -  person Devstr    schedule 20.02.2018
comment
Разве вы не должны вызывать executeQuery для qualStmt, а не для mapStmt?   -  person Honeyboy Wilson    schedule 20.02.2018
comment
@HoneyboyWilson Вот так... Я слишком долго программировал. Спасибо, что нашли это.   -  person dtgman    schedule 20.02.2018


Ответы (1)


HoneyboyWilson нашел проблему. Вызывал неправильный оператор, но он содержал правильные столбцы, поэтому не производил никаких исключений.

person dtgman    schedule 20.02.2018