Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение количества строк в ResultSet / 25 сообщений из 35, страница 1 из 2
26.11.2004, 11:29
    #32801051
GMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
Как грамотно определить количество строк в полученном ResultSet?

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

Неужели только так?
...
Рейтинг: 0 / 0
26.11.2004, 11:34
    #32801070
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
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
26.11.2004, 11:42
    #32801089
GMax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
Исчерпывающе! Пасиба.
Значит книги врут.
...
Рейтинг: 0 / 0
26.11.2004, 12:46
    #32801298
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
Две копейки: столкнулся с тем, что Oracle 9i JDBC Driver позволяет получать ResultSet.TYPE_SCROLL_SENSITIVE только для ResultSet'ов, полученных через выполнение select'а, но не как refcursor, из процедуры, к примеру. Такое вот ограничение.. В Oracle 10g JDBC уже работает.
...
Рейтинг: 0 / 0
26.11.2004, 13:31
    #32801418
SmaLL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
В книге навверное подразумевался JDBC 1.0, т.к. в этой версии можно по Resultset пройти только один раз в одном направлении

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

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

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

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

Ну зачем же сразу так грубо?
Может быть и 1.0, правда ссылки на версию в книге я не нашел.
Кстати книга была написана в 2000 году, а JDBC 2.0 появился еще в 1998 если не ошибаюсь. Но в 2000 точно был. Так что вот...
...
Рейтинг: 0 / 0
29.11.2004, 23:13
    #32804884
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
А.Грасо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
30.11.2004, 12:18
    #32805471
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
чего-то не получилось у меня получить 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
30.11.2004, 12:26
    #32805493
zalexaka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
А.Грасо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
30.11.2004, 12:30
    #32805512
А.Грасоff™
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
zalexakaгде-та я видел про ето (оракловый драйвер) топик, тока найти не могу

это?

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

это?

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

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

SELECT * FROM dba_objects;

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

Запрос

SELECT COUNT(*) FROM dba_objects;

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

Правда это с учетом вывода на экран. Однако, согласитесь, разница во времени существенная.
Поскольку я принципиально не использую чувствительных к скроллированию курсоров, потребность в памяти при десятках подряд выполняемых запросов составляет 12М и не больше.
Что касается скроллируемых наборов, то предпочитаю собственного изготовления RowSet с кэшированием строк в базе, расположенной на сервере приложений.
...
Рейтинг: 0 / 0
01.12.2004, 09:48
    #32806952
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
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
01.12.2004, 15:01
    #32807775
MBasil
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
Господа, обращаю ваше внимание на некоторые дополнительные аспекты.

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

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

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

4. Откровенно говоря менторский тон stdio мне надоел, и с Вашего разрешения, я в дискуссию по этому топику больше вмешиваться не буду. Пусть последнее слово останется за ним.
...
Рейтинг: 0 / 0
01.12.2004, 15:41
    #32807889
stdio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение количества строк в ResultSet
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Определение количества строк в ResultSet / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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