powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение количества строк в ResultSet
25 сообщений из 35, страница 1 из 2
Определение количества строк в ResultSet
    #32801051
GMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как грамотно определить количество строк в полученном ResultSet?

В книге "Сервлеты и JavaServer Pages" написано:
"Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false".

Неужели только так?
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32801070
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GMaxКак грамотно определить количество строк в полученном ResultSet?

В книге "Сервлеты и JavaServer Pages" написано:
"Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false".

Неужели только так?

ResultSet rs = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(qry);
rs.last();
int resulSetSize = rs.getRow();
rs.beforeFirst();

или выполнить select count(*) from table1 where a > 1
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32801089
GMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исчерпывающе! Пасиба.
Значит книги врут.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32801298
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две копейки: столкнулся с тем, что Oracle 9i JDBC Driver позволяет получать ResultSet.TYPE_SCROLL_SENSITIVE только для ResultSet'ов, полученных через выполнение select'а, но не как refcursor, из процедуры, к примеру. Такое вот ограничение.. В Oracle 10g JDBC уже работает.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32801418
Фотография SmaLL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В книге навверное подразумевался JDBC 1.0, т.к. в этой версии можно по Resultset пройти только один раз в одном направлении

А способ предложенный А.Грасоff™ будет работать только начиная с JDBC 2.0

Так что не надо на книжки гнать
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32801501
GMax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SmaLLВ книге навверное подразумевался JDBC 1.0, т.к. в этой версии можно по Resultset пройти только один раз в одном направлении

А способ предложенный А.Грасоff™ будет работать только начиная с JDBC 2.0

Так что не надо на книжки гнать

Ну зачем же сразу так грубо?
Может быть и 1.0, правда ссылки на версию в книге я не нашел.
Кстати книга была написана в 2000 году, а JDBC 2.0 появился еще в 1998 если не ошибаюсь. Но в 2000 точно был. Так что вот...
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32804884
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ GMaxКак грамотно определить количество строк в полученном ResultSet?

В книге "Сервлеты и JavaServer Pages" написано:
"Единственный способ определения количества строк - постоянное повторение вызова метода next объекта ResultSet, пока он не возвратит значение false".

Неужели только так?

ResultSet rs = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY).executeQuery(qry);
rs.last();
int resulSetSize = rs.getRow();
rs.beforeFirst();
Ну ты научишь, Граспых. Память-то не резиновая.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805471
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чего-то не получилось у меня получить OutOfMemory на
[select * from table]. в table - 13796090 строк.

сервер БД - Microsoft SQL 2000
драйвер на клиенте - JNetDirect 3.3
клиентский комп - PIV/2GHz, 512MB, Windows 2000 Prof.
серверный комп - 2 x PIII/1.3GHz, 1GB, Windows 2000 Prof.

на клиенте память при выполнении java-теста, аналогичному привиденным,
выросла на 6MB, сервер тоже не особо напрягался.

--
FUCK THE iNET!!!
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805493
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™чего-то не получилось у меня получить OutOfMemory на
[select * from table]. в table - 13796090 строк.

сервер БД - Microsoft SQL 2000
драйвер на клиенте - JNetDirect 3.3
клиентский комп - PIV/2GHz, 512MB, Windows 2000 Prof.
серверный комп - 2 x PIII/1.3GHz, 1GB, Windows 2000 Prof.

на клиенте память при выполнении java-теста, аналогичному привиденным,
выросла на 6MB, сервер тоже не особо напрягался.

--
FUCK THE iNET!!!
где-та я видел про ето (оракловый драйвер) топик, тока найти не могу
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805512
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexakaгде-та я видел про ето (оракловый драйвер) топик, тока найти не могу

это?

http://www.sql.ru/forum/actualthread.aspx?tid=32346
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805528
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ zalexakaгде-та я видел про ето (оракловый драйвер) топик, тока найти не могу

это?

http://www.sql.ru/forum/actualthread.aspx?tid=32346
ниа не то, нимагу вспомнить словов для поиска
зы
кстати ты там тоже участвовал
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805544
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805773
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Курсор Oracle обеспечивает последовательный доступ только в одном направлении (несмотря на скроллируемость резервного набора).
Поэтоу предложенный метод пройти до конца, а потом вернуться в начало приведет только к повторному выполнению запроса и перебору всех строк, но скрытым образом.
То есть сначала все строки извлекаются на клиента, а потом выполняется повторно запрос и в полученном НОВОМ наборе курсор устанавливается в начало.
Если уж так хочется узнать количество строк, перед основным запросом выполни SELECT COUNT(*) FROM ... WHERE "условие"
где "условие" точно такое как в основном запросе.
Все таки будет меньший напряг для системы.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805893
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilКурсор Oracle обеспечивает последовательный доступ только в одном направлении (несмотря на скроллируемость резервного набора).
Поэтоу предложенный метод пройти до конца, а потом вернуться в начало приведет только к повторному выполнению запроса и перебору всех строк, но скрытым образом.
То есть сначала все строки извлекаются на клиента, а потом выполняется повторно запрос и в полученном НОВОМ наборе курсор устанавливается в начало.Это ты сам придумал? Или это где-то написано? Как объяснишь вот это:
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805914
zalexaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 stdio
а версия thin драйвера у вас какая?
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805969
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexaka2 stdio
а версия thin драйвера у вас какая?9.0.1.5.0
На других версиях, думаю, поведение будет точно таким же.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32805972
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zalexaka2 stdio
а версия thin драйвера у вас какая?а еще у него пентиум один
с 32 мб озу
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806059
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to stdio
Ну, и как это противоречит тому, что я написал ?
Когда ты вызвал execute(), выполнился парсинг SQL и было произведено его выполнение.
Указатель курсора установлен на начало для выборки.
Когда ты вызвал rs.last() все строчки должны быть "профетчены" на клиента, что естественно потребовало массу работы.
В чем ошибочность моих слов ?
Проблема этого дела в том, что не пройдя весь курсор с фетчем до конца ты не узнаешь, сколько возвращено строк.
Это принципиальный вопрос, так как узнать количество строк в Oracle можно только перебрав их все.
Вернуться в начало - значит повторно выполнить запрос.
Чем тебе не нравиться COUNT(*). Запрос, конечно все равно выполняется, но хоть фетч уменьщается до одной строки.
И дело тут не в версии драйвера, а в механизме работы курсора Oracle.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806223
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilto stdio
Ну, и как это противоречит тому, что я написал ?
Когда ты вызвал execute(), выполнился парсинг SQL и было произведено его выполнение.
Указатель курсора установлен на начало для выборки.
Когда ты вызвал rs.last() все строчки должны быть "профетчены" на клиента, что естественно потребовало массу работы.
В чем ошибочность моих слов ?
Проблема этого дела в том, что не пройдя весь курсор с фетчем до конца ты не узнаешь, сколько возвращено строк.
Это принципиальный вопрос, так как узнать количество строк в Oracle можно только перебрав их все.
Вернуться в начало - значит повторно выполнить запрос.
Чем тебе не нравиться COUNT(*). Запрос, конечно все равно выполняется, но хоть фетч уменьщается до одной строки.
И дело тут не в версии драйвера, а в механизме работы курсора Oracle.противоречит тем, что ты рассказываешь про то как работает драйвер, как ты думаешь, а не так как Oracle это делает на самом деле . А на деле он просто скачивает всё в память на клиента и там уж создаёт иллюзию обратно крутимого курсора.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806316
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уел !
Ну да, я не обратил внимания на то, что у тебя в примере результирующий набор TYPE_SCROLL_INSENSITIVE.
И в этом моя ошибка.
Однако при чувствительном к изменениям наборе запрос все-равно будет выполняться повторно.
С другой стороны большой, наверное, кайф выбрать тысячи строк на клиента только для того, чтобы выяснить сколько строк на самом деле будет выбрано.
Таким образом задача stdio видимо состояла не в том, чтобы ответить на вопрос, как без выполнения операции фетч выяснить - сколько строк вернет запрос, а в том чтобы уличить меня в ошибке.
Ты победил !
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806505
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilТаким образом задача stdio видимо состояла не в том, чтобы ответить на вопрос, как без выполнения операции фетч выяснить - сколько строк вернет запрос, а в том чтобы уличить меня в ошибке.Нет. Я просто хотел показать, что лучше один раз провести эксперимент, чем строить гипотезы. Даже если будет SENSITIVE, то совсем не очевидно, что будет перезапускаться весь запрос целиком. Не будет вылняться select * from (...) where rowid = ... ? А? А под хранение значений "предыдущих" rowid всё равно память нужна => всегда я найду такую таблицу, на которой оперативной памяти не хватит.
_________________
Умерщвление прекрасной гипотезы мерзким фактом являет собой величайшую трагедию науки
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806525
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Полагаю, что при перезапросах ROWID использоваться не будет, так он неизвестен для вставленных после первого запроса строк.
Поэтому Вашу замечательную сентенцию по поводу красивой гипотезы возвращаю Вам обратно.

Извините за назойливость. Маленькое дополнение
У меня есть небольшая универсальная программа по выполнению запросов и выводу результатов написанная на Java.
В ней запрос (Oracle 10g )

SELECT * FROM dba_objects;

возвратил строк : 48259 За время : 12344 м-сек.

Запрос

SELECT COUNT(*) FROM dba_objects;

возвратил строк : 1 За время : 203 м-сек.

Правда это с учетом вывода на экран. Однако, согласитесь, разница во времени существенная.
Поскольку я принципиально не использую чувствительных к скроллированию курсоров, потребность в памяти при десятках подряд выполняемых запросов составляет 12М и не больше.
Что касается скроллируемых наборов, то предпочитаю собственного изготовления RowSet с кэшированием строк в базе, расположенной на сервере приложений.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32806952
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilПолагаю, что при перезапросах ROWID использоваться не будет, так он неизвестен для вставленных после первого запроса строк.
Поэтому Вашу замечательную сентенцию по поводу красивой гипотезы возвращаю Вам обратно."To support updatability and change sensitibility, Oracle JDBC drivers cache the ROWID along with each row". (взято из читаемого курса по "Oracle9i: Access the Database with Java and JDBC"). Проверять - проверял до курса.
MBasilИзвините за назойливость. Маленькое дополнение
У меня есть небольшая универсальная программа по выполнению запросов и выводу результатов написанная на Java.
В ней запрос (Oracle 10g )

SELECT * FROM dba_objects;

возвратил строк : 48259 За время : 12344 м-сек.

Запрос

SELECT COUNT(*) FROM dba_objects;

возвратил строк : 1 За время : 203 м-сек.

Правда это с учетом вывода на экран. Однако, согласитесь, разница во времени существенная.
Поскольку я принципиально не использую чувствительных к скроллированию курсоров, потребность в памяти при десятках подряд выполняемых запросов составляет 12М и не больше.
Что касается скроллируемых наборов, то предпочитаю собственного изготовления RowSet с кэшированием строк в базе, расположенной на сервере приложений.Ах, ну всё про баню. Я где-то утверждал, что надо пересчитывать строки на клиенте?
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32807775
MBasil
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, обращаю ваше внимание на некоторые дополнительные аспекты.

1. То, что для изменения строки, еще в момент выполнения операции POST и в момент ее блокирования необходимо кэширование ROWID, это несомненно, как несомненно и то, что драйвер обязан это делать.

2. Однако, рассмотрим следующую ситуацию. Пользователь работает с последними строками резервного набора, а в это время администратор удаляет одну из первых строк и вставляет ее вновь. При этом он еще вставляет десяток строк (одна из них может получить то же самое ROWID). Можете ли Вы гарантировать, что по ROWID будет получена та же строка, когда пользователь вернется в начало набора ? Фиксация ROWID ведь гарантирована только при блокировании строки. Представьте себе - пользователь проскроллировал набор в начало увидел на месте старой строки нечто совершенно неожиданное, так как ROWID старой строки получила другая.

3. Ситуация практически та же, но запрос обращается к секционированной таблице, а администратор выполняет операции MERGE PARTITION или SPLIT PARTITION.
Можно было бы привести и другие примеры, но думаю и этого достаточно.

4. Откровенно говоря менторский тон stdio мне надоел, и с Вашего разрешения, я в дискуссию по этому топику больше вмешиваться не буду. Пусть последнее слово останется за ним.
...
Рейтинг: 0 / 0
Определение количества строк в ResultSet
    #32807889
Фотография stdio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBasilГоспода, обращаю ваше внимание на некоторые дополнительные аспекты.Типа, пусть мировое сообщество нас рассудит?
MBasil1. То, что для изменения строки, еще в момент выполнения операции POST и в момент ее блокирования необходимо кэширование ROWID, это несомненно, как несомненно и то, что драйвер обязан это делать.До этого Вы выдвигали совсем другую гипотезу. http://www.sql.ru/forum/actualpost.aspx?bid=38&tid=141321&mid=1149935&p=1&act=quot#1146913
MBasil2. Однако, рассмотрим следующую ситуацию. Пользователь работает с последними строками резервного набора, а в это время администратор удаляет одну из первых строк и вставляет ее вновь. При этом он еще вставляет десяток строк (одна из них может получить то же самое ROWID). Можете ли Вы гарантировать, что по ROWID будет получена та же строка, когда пользователь вернется в начало набора ? Фиксация ROWID ведь гарантирована только при блокировании строки. Представьте себе - пользователь проскроллировал набор в начало увидел на месте старой строки нечто совершенно неожиданное, так как ROWID старой строки получила другая.
3. Ситуация практически та же, но запрос обращается к секционированной таблице, а администратор выполняет операции MERGE PARTITION или SPLIT PARTITION.
Можно было бы привести и другие примеры, но думаю и этого достаточно.Выводы где? Смотрим в документацию и видим: http://download-west.oracle.com/docs/cd/B10501_01/java.920/a96654/resltset.htm#1020090
Повторюсь "Умерщвление прекрасной гипотезы мерзким фактом являет собой величайшую трагедию науки"
MBasil4. Откровенно говоря менторский тон stdio мне надоел, и с Вашего разрешения, я в дискуссию по этому топику больше вмешиваться не буду. Пусть последнее слово останется за ним.И пусть ему будет стыдно!
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение количества строк в ResultSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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