Как получить количество строк в JDBC?

Я выполнил запрос JDBC для получения набора результатов. Прежде чем перебирать его, я хотел бы быстро узнать, сколько строк было возвращено. Как я могу сделать это с высокой производительностью?

Я использую Java 6, Oracle 11g и новейшие драйверы Oracle JDBC.

    Вам нужно будет сделать это как отдельный запрос, например:

    SELECT COUNT(1) FROM table_name 

    Некоторые драйверы JDBC могут вам рассказать, но это необязательное поведение, и, к тому же, драйвер может еще не знать. Это может быть связано с тем, как оптимизирован запрос, например, две страtagsи исполнения в Oracle – это как можно быстрее получить все строки или как можно быстрее получить первую строку.

    Если вы выполняете два отдельных запроса (один – счет, а другой – запрос), вам нужно будет сделать их в рамках одной транзакции. Это будет хорошо работать с Oracle, но может быть проблематичным для других баз данных (например, SQL Server либо покажет вам незафиксированные данные, либо блокирует внешнее незафиксированное обновление в зависимости от уровня изоляции, тогда как Oracle поддерживает уровень изоляции, который дает вам последовательный данные без блокировки внешних обновлений).

    Обычно, хотя на самом деле не имеет значения, сколько строк есть. Обычно такой запрос обрабатывается или обрабатывается пакетным способом, и в любом случае у вас есть информация о ходе выполнения в виде строк, загружаемых / обработанных, и вы можете обнаружить конец набора результатов (очевидно).

    Короткий ответ: вы не можете.

    Длинный ответ: вы не можете, отчасти потому, что firebase database может лениво оценивать запрос, возвращая только строки по мере их запроса.

    EDIT: с помощью прокручиваемого ResultSet вы можете:

    Действительно, я задал этот самый вопрос в новостной группе баз данных Java давным-давно (еще в 2001 году!) И получил некоторые полезные ответы .

     ResultSet rs = stmt.executeQuery(sql); int rowCount = rs.last() ? rs.getRow() : 0; // Number of rows in result set. Don't forget to set cyrsor to beforeFirst() row! :) 

    Чтобы получить количество строк из JDBC:

     ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME"); rs.next(); int count = rs.getInt(1); 

    Если ваш драйвер поддерживает его (!), Вы можете вызвать ResultSet.afterLast () ResultSet.getRow () ResultSet.beforeFirst (). Производительность может быть или не быть хорошей.

    Лучшим решением было бы переписать ваш алгоритм, чтобы не требовать размера спереди.

    Без тернарного оператора

     rs.last(); // Moves the cursor to the last row in this ResultSet object. int rowCount = rs.getRow(); //Retrieves the current row number. rs.beforeFirst(); //Moves the cursor to the front of this ResultSet object,just before the first row. 

    С тройным оператором одна линия

     int rowCount = rs.last() ? rs.getRow() : 0; rs.beforeFirst(); 

    Код:

     //Create a Statement class to execute the SQL statement Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT COUNT(*) AS COUNT FROM TABLENAME"); while(rs.next()) { System.out.println("The count is " + rs.getInt("COUNT")); } //Closing the connection con.close(); 
    Давайте будем гением компьютера.