2008-10-02 4 views
23

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

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

ответ

26

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

SELECT COUNT(1) FROM table_name 

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

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

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

+0

Хороший ответ, хотя я не понимаю, окончательный комментарий о обладании информацией о ходе работы. Откуда это? – Aktau 2011-11-08 14:48:19

+0

Для этого требуется другой запрос. Если у вас есть прокручиваемый набор результатов, в других ответах есть лучшие варианты. – JDuarteDJ 2015-12-10 14:34:52

18

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

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

EDIT: С помощью прокручивать ResultSet можно :)

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

4

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

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

15
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! :) 
+4

Работает хорошо. Вы должны добавить, что для этого вам нужен прокручиваемый результирующий набор. – 2012-12-04 09:18:51

+0

Поддержка предыдущего комментария плюс я думаю, что это должен правильный ответ, поскольку он обеспечивает более короткий и более прямой способ сделать это! – JDuarteDJ 2015-12-10 14:34:01

0

Код:

//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(); 
10

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

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME"); 
rs.next(); 
int count = rs.getInt(1); 
Смежные вопросы