Как получить количество строк в JDBC? - PullRequest
27 голосов
/ 02 октября 2008

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

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

Ответы [ 7 ]

32 голосов
/ 02 октября 2008

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

SELECT COUNT(1) FROM table_name

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

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

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

19 голосов
/ 13 апреля 2012
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! :)
18 голосов
/ 02 октября 2008

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

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

РЕДАКТИРОВАТЬ: С помощью прокручиваемого ResultSet вы можете:)

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

10 голосов
/ 18 июля 2013

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

ResultSet rs = st.executeQuery("select count(*) from TABLE_NAME");
rs.next();
int count = rs.getInt(1);
4 голосов
/ 02 октября 2008

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

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

2 голосов
/ 26 июля 2018

без троичного оператора

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();
0 голосов
/ 29 апреля 2013

Код:

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