powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ResultSet + rowCount
26 сообщений из 26, показаны все 2 страниц
ResultSet + rowCount
    #38159335
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как все таки правильно это сделать, гугл подсказывает несколько приемов.

Так какой из них правильный?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Connection c = null;
PreparedStatement s = null;
ResultSet rs = null;
....
s = c.prepareStatement(sql);
rs = s.executeQuery();

--как более правильнее подсчитать количество записей??
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159365
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный это вызвать второй такоже запрос SELECT COUNT(...)
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159370
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПравильный это вызвать второй такоже запрос SELECT COUNT(...)

это без шуток и смеха?если да , это это печально
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159384
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rsltr--как более правильнее подсчитать количество записей??Получить все и посчитать в цикле?
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159394
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovrsltr--как более правильнее подсчитать количество записей??Получить все и посчитать в цикле?

Код: java
1.
rs = s.executeQuery();



вот здесь хочу знать сколько строк
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159397
Michael T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczПравильный это вызвать второй такоже запрос SELECT COUNT(...)
+1

Количество записей, которое возвращает ResultSet, неизвестно до того момента пока ResultSet.next() не вернет false.
Соответственно, либо гнать next() до конца, либо SELECT COUNT() ...
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159410
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rsltrвот здесь хочу знать сколько строкКак вам уже сказали "скока точно строк" будет известно тогда, когда будет вычитан весь набор.
"Считать в цикле", конечно, не надо :)
Если вы хотите узнать сколько строк вернёт запрос, не выбирая строки на клиента, то ваш путь - групповая функция sum() и насилование сервера повторными запросами.
Плюс, в многопользовательской среде, вариант с двумя запросами может давать погрешность.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159601
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovвот здесь хочу знать сколько строкКак вам уже сказали "скока точно строк" будет известно тогда, когда будет вычитан весь набор.
"Считать в цикле", конечно, не надо :)
Если вы хотите узнать сколько строк вернёт запрос, не выбирая строки на клиента, то ваш путь - групповая функция sum() и насилование сервера повторными запросами.[/quot]
ResultSet.last() можно ещё попробовать. Если там скролируемый курсор, тогда всё на клиента, возможно, и не вытянется.

Basil A. SidorovПлюс, в многопользовательской среде, вариант с двумя запросами может давать погрешность.
Даже в одной транзакции?
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38159633
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДаже в одной транзакции?
угу. До второго запроса кто-то сделал коммит и Count изменится.
Т.е. лучше записи не считать)
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160009
Victor Nevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правильного нет.
есть несколько способов:
1) уже описали:
SELECT COUNT(*), но если долгого играющий запрос +и/или интенсивная модификация данных, следующий SELECT * может вернуть не то количество данных.
лечится
connection.setAutoCommit(false);
+
connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_REPEATABLE_READ);
или
connection.setTransactionIsolation(java.sql.Connection.TRANSACTION_SERIALIZABLE);
зависит от возможностей СУБД.

2) типа этого:
java.sql.Statement statement = connection.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE, java.sql.ResultSet.CONCUR_READ_ONLY);
java.sql.ResultSet resultSet = statement.executeQuery("...");
resultSet.last();
int size = resultSet.getRow();
resultSet.first();

3)SELECT *, ROW_COUNT() OVER () AS "SIZE#" ...
int size = resultSet.getInt("SIZE#");
зависит от возможностей СУБД, работает быстро.


..., а потом окажется, что записей более, чем 0x7fffffff :)
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160505
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо товарищи! жалко что нет единого решения
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160521
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovrsltr--как более правильнее подсчитать количество записей??Получить все и посчитать в цикле?

Лучший способ!

(без шуток, если автор темы не поймёт).
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160523
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rsltrBlazkowiczПравильный это вызвать второй такоже запрос SELECT COUNT(...)

это без шуток и смеха?если да , это это печально

Этот способ не годится никуда. Он тебе посчитает записи в одном наборе данных, а ты будешь потом получать уже ДРУГОЙ набор данных, там записей может быть уже другое количество.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160545
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЛучший способ!
(без шуток, если автор темы не поймёт).
С фига ли. Обычно это нужно для задачи постраничного просмотра. Т.е. клиенту, чтобы узнать количество страниц нужно будет вычитать всю выборку? Офигенное решение.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160549
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЭтот способ не годится никуда. Он тебе посчитает записи в одном наборе данных, а ты будешь потом получать уже ДРУГОЙ набор данных, там записей может быть уже другое количество.
Зависит от задачи. Для постраничего просмотра - самое то. Для других задач, не особо представляю нафига count вообще нужен? Разве что оценить время обработки? Но его можно только "оценить", поэтому точное значение нафиг не упало.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160552
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rsltrСпасибо товарищи! жалко что нет единого решения
для конкретной задачи, есть конкретное решение. Здесь нет конктретной задачи. Не ясно что за база, и для чего понадобилось количество.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160583
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rsltrСпасибо товарищи! жалко что нет единого решения
на ещё
http://www.codecodex.com/wiki/Count_the_number_of_rows_in_a_Oracle_database_table
...
единого нет, т.к. нельзя узнать сколько хлеба в булочной не сходив в магазин.
(не закачав всю БД на клиента)
- Бери тогда какой-нить:
Код: java
1.
RowSet rowset = new OracleCachedRowSet();
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160597
DoSOfRedRiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использовал такой код, и остался доволен:

Код: java
1.
2.
3.
rs.beforeFirst();
rs.last();
rowCount = data.getRow();
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160607
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DoSOfRedRiverЯ использовал такой код, и остался доволен:

Код: java
1.
2.
3.
rs.beforeFirst();
rs.last();
rowCount = data.getRow();


конечно это лучше чем складывать переменную на счётах.
Эта проблема должна решаться на уровне компонента Data\Row.
Т.к. в одном потоке на этой строке
Код: java
1.
rs.last();


код встанет и будет висеть минуты 2.
Кому что надо в итоге по БЛ.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160720
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovrsltrвот здесь хочу знать сколько строкКак вам уже сказали "скока точно строк" будет известно тогда, когда будет вычитан весь набор.
"Считать в цикле", конечно, не надо :)
Если вы хотите узнать сколько строк вернёт запрос, не выбирая строки на клиента, то ваш путь - групповая функция sum() и насилование сервера повторными запросами.
Плюс, в многопользовательской среде, вариант с двумя запросами может давать погрешность.

Ребята, ещё раз -- это ОЧЕНЬ ПЛОХОЙ способ (хотя когда-то можно воспользоваться и им).

Объясняю.

Запрос каждый -- транзакция. Но ваша транзакция не единственная в БД, как правило, записи удаляются и добавляются, меняются. Запрос с COUNT(*) -- это одна транзакция, следующий уже на выборку -- это другая транзакция, кол-во записей может не совпадать.


Используя предварительный запрос с COUNT(*) для подсчёта записей, ты заставляешь сервер выполнять один и тот же запрос два раза. Это может быть очень накладно, если запрос сложный.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160731
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczMasterZivЛучший способ!
(без шуток, если автор темы не поймёт).
С фига ли. Обычно это нужно для задачи постраничного просмотра. Т.е. клиенту, чтобы узнать количество страниц нужно будет вычитать всю выборку? Офигенное решение.

ЛУЧШЕЕ решение.

Вот совсем недавно мы выкинули у себя запрос с COUN(*) -ми и заменили его на просто выполнение запроса, одинарное.
Время реакции на любой запрос уменьшилось вдвое.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160738
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
нету Лучшего без Цели (с)
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160745
Alexander A. Sak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У некоторых серверов есть аналитические функции. Например
Код: plsql
1.
select t.*, count(*) over() total_cnt from a_table;


даст и строки и общее количество в колонке total_cnt.

Естественно, последствия надо понимать.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160823
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivРебята, ещё раз -- это ОЧЕНЬ ПЛОХОЙ способ (хотя когда-то можно воспользоваться и им).

А capital case типа должен придавать значимости фразе? Мы не знаем нужно ли там точное значение или нет. Оценить на сколько вариант плох без подробностей задачи невозможно.


MasterZiv] Запрос каждый -- транзакция. Но ваша транзакция не единственная в БД, как правило, записи удаляются и добавляются, меняются. Запрос с COUNT(*) -- это одна транзакция, следующий уже на выборку -- это другая транзакция, кол-во записей может не совпадать.

Это далеко не всегда ОЧЕНЬ ПЛОХО. Я даже придумать пример не могу почему это вдруг может оказаться ОЧЕНЬ ПЛОХО.

MasterZivИспользуя предварительный запрос с COUNT(*) для подсчёта записей, ты заставляешь сервер выполнять один и тот же запрос два раза. Это может быть очень накладно, если запрос сложный.
План построится один раз и по нему будет нормально фигарится сколько угодно. Да, немного медленее. Но в противном случае проще выкинуть подсчет количества вообще. О чем выше уже написали.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38160827
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЛУЧШЕЕ решение.
Вот совсем недавно мы выкинули у себя запрос с COUN(*) -ми и заменили его на просто выполнение запроса, одинарное.
Время реакции на любой запрос уменьшилось вдвое.
ЛУЧШЕЕ решение, конечно же, не считать вообще. Только автор темы об этом не спрашивает.
...
Рейтинг: 0 / 0
ResultSet + rowCount
    #38161307
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczДаже в одной транзакции?Уровни изолированности и их реализация в разных БД никто не отменял.
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / ResultSet + rowCount
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]