Ошибка JDBC / Resultset - PullRequest
       25

Ошибка JDBC / Resultset

0 голосов
/ 02 января 2012

Мой mysql-запрос в Java всегда останавливается (т.е. останавливается и не продолжается) в определенной позиции, а именно 543 858; хотя таблица содержит ок. 2 000 000 записей. Я проверил это, зарегистрировав текущую выборку результатов. Это воспроизводимо и происходит каждый раз в одной и той же позиции.

"SELECT abc from bcd WHERE DATEDIFF(CURDATE(), timestamp) <= '"+days+"'");

Дополнение: определенно является ошибкой Java, я только что опробовал это утверждение в Navicat (время выполнения 50-х годов).

Похоже, что запрос зависает после того, как журнал сообщает мне, что теперь добавляется результат позиции 543 858.

try {
    ...
    ResultSet res = new ResultSet();
    PreparedStatement stmt = new PreparedStatement(); // prepare statmenet etc.
    stmt.setFetchSize(Integer.MIN_VALUE);
    res = stmt.executeQuery();
    ...
    System.out.println(res.getStatement());
    ...
    while (res.next())
        treeSet.add(res.getString("userid"));

} catch (Exception e) {
     e.printStackTrace();
}

Редактировать: Нам удалось выяснить проблему. Этот метод подойдет, и возвращенный результат (500 000 вместо 2 000 000) также является правильным (посмотрел в неправильном БД, чтобы проверить сумму); проблема заключалась в том, что следующий вызов метода, который использовал результат описанного выше, принимает буквально навсегда, но не реализовал регистрацию. Так что я был одурачен отсутствующими консольными журналами.

В любом случае, спасибо!

Ответы [ 3 ]

1 голос
/ 02 января 2012

В MySQL, чтобы использовать потоковые ResultSets, вы должны указать больше параметров, а не только fetchSize.

Попробуйте:

stmt = conn.createStatement('select ...', java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

и посмотрите, работает ли это.

Это задокументировано в разделе ResultSet.

Странно, чтоэто не исключение, но это единственный подозреваемый, который у меня есть.Может быть, он запускает сборку мусора / сбрасывает память на диск, и на это уходит так много времени, что его не удается выбросить.

1 голос
/ 02 января 2012

Я думаю, что у вас может быть недостаточно памяти после обработки полмиллиона записей.Попробуйте выделить больше памяти, используя параметры командной строки -Xmx и т. Д. См. здесь для получения дополнительной информации о параметрах командной строки.

0 голосов
/ 02 января 2012
  1. Я бы попытался добавить к вашему запросу «LIMIT 543857», а затем «LIMIT 543857» и посмотреть, что произойдет.
  2. Если приведенное выше не помогает, используйте директиву limit в сочетании с order by.

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

...