
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.07.2007, 11:42:14
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Всем привет! У меня возникла следующая проблема, но я даже не знаю в какую сторону копать. Есть метод, который производит выгрузку результата работы запроса в plain-text файл. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Всё отлично работает, до тех пор пока я не стал получать в результате запроса много данных. На данный момент это 1,5М строк по 800 байт каждая. В этом случае вызов Код: plaintext На сколько я понимаю он пытаеться подтянуть все данные на клиент, чем и убивает JVM. Можно ли как-то заставить JDBC открыть курсор на стороне БД, и считывать данные непосредственно при вызове, например, rs.next() ? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 12:09:20
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
А что мешает оптимизировать SQL запрос, чтобы он возвращал ограниченное количество результатов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 12:22:22
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Мне нужны все эти строки. Или я Вас не правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 12:25:50
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
а по кусочкам запрашивать слабо ? ну и можно с типами курсоров поигратьсо. хотя всё от конкретного драйвера зависит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 12:30:56
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 12:34:42
|
|||
|---|---|---|---|
|
|||
JDBC out of memory |
|||
|
#18+
Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто. Пробовали Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 13:04:36
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
- а что за база? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 13:05:43
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Хрюхрюшкин. preparedStatement.setFetchSize(...); Попробовал. Результат тот-же. мои JDBC драйвера (Pоstgres 8.2) вообще ИМХО не реагируют на этот параметр :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 13:19:38
|
|||
|---|---|---|---|
|
|||
JDBC out of memory |
|||
|
#18+
Angel13 Хрюхрюшкин. preparedStatement.setFetchSize(...); Попробовал. Результат тот-же. мои JDBC драйвера (Pоstgres 8.2) вообще ИМХО не реагируют на этот параметр :( Сделай autocommit у соединения в false. http://jdbc.postgresql.org/documentation/82/query.html Смотри секцию "Getting results based on a cursor". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 13:48:08
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто. LIMIT, OFFSET и COUNT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:02:54
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Kachalov Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто. LIMIT, OFFSET и COUNT очень плохой вариант ИМХО курсоры - это то, что нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:20:10
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Dan Blackочень плохой вариант - чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:23:28
|
|||
|---|---|---|---|
|
|||
JDBC out of memory |
|||
|
#18+
Kachalov - чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера. Лучше использовать курсоры. Я думаю, что драйвер их должен поддерживать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:29:55
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Kachalov- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера. Плохой тем, что если у меня в таблице 20 записей и я пишу Код: plaintext 1. а потом Код: plaintext 1. то нет никакой гарантии что полученные наборы будут равны : Код: plaintext 1. Чтобы такого не было нужно сортировать - а это на больших данных очень дорого. Плюс ко всему за промежуток время между считываниями данные могут уже поменяться. Ekshibarov Vladimir http://jdbc.postgresql.org/documentation/82/query.html Смотрю, похоже то, что нужно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:31:07
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Kachalov- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера. плох по ресурсоёмкости при больших и сложных выборках + результат при такой выборке может изменяться другими параллельно работающими запросами, то есть конечное количество строк в итоге неопределено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 16:33:48
|
|||
|---|---|---|---|
|
|||
JDBC out of memory |
|||
|
#18+
Angel13Всем привет! У меня возникла следующая проблема, но я даже не знаю в какую сторону копать. Всё отлично работает, до тех пор пока я не стал получать в результате запроса много данных. На данный момент это 1,5М строк по 800 байт каждая. В этом случае вызов Код: plaintext На сколько я понимаю он пытаеться подтянуть все данные на клиент, чем и убивает JVM. Можно ли как-то заставить JDBC открыть курсор на стороне БД, и считывать данные непосредственно при вызове, например, rs.next() ? Спасибо. IMHO если не использовать обновляемые и двунаправленные курсоры, то ничего на клиента тянутся без спроса (ну разве что + fetch size) не будет. Попробуйте, может тут собака порылась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 17:07:26
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Angel13Чтобы такого не было нужно сортировать - а это на больших данных очень дорого. Плюс ко всему за промежуток время между считываниями данные могут уже поменяться. - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу - гарантией неизменности данных будет использование транзакций (кстати почему Вы думаете что использование курсора гаранирует неизменность данных? опять же это сильно зависит от реализации драйвера) Dan Blackплох по ресурсоёмкости при больших и сложных выборках - возможно, но запрос один и тот же и если использовать preparedStatement возможно (зависит от реализации драйвера и возможностей базы) проблем не будет. Кроме того точно не будет проблем с памятью в JVM. Т. е. тут надо определиться кому должно быть "плохо": приложению или БД :) Dan Black результат при такой выборке может изменяться другими параллельно работающими запросами, то есть конечное количество строк в итоге неопределено - транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 17:33:31
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Курсоры и подразумевают транзакции. preparedStatement больше зависит от возможностей базы и выигрыш от его использования в теории не сравнится с выигрышом от использования курсоров. К тому же речь идёт об определенной БД, поэтому ссылаться на возможности и фишки других баз данных не имеет смысла. Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 18:02:26
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу Совсем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 18:38:26
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу Совсем нет. - Вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 18:39:17
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу Совсем нет. +1. Причем это написано в той сцылке которую ты дал. Kachalov- гарантией неизменности данных будет использование транзакций (кстати почему Вы думаете что использование курсора гаранирует неизменность данных? опять же это сильно зависит от реализации драйвера) По дефолту результаты выборки из курсора консистентны на момент его открытия (по крайней мере при беглом осмотре доки PostgreSQL, я это понял так). В случае использования нескольких запросов - такого не будет. Kachalov- транзакции Наверно стоит вначале что-нибудь о них почитать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.07.2007, 19:02:12
|
|||
|---|---|---|---|
JDBC out of memory |
|||
|
#18+
Timm Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу Совсем нет. +1. - и Вы правы Timm Kachalov- транзакции Наверно стоит вначале что-нибудь о них почитать. - что то грубовато и смысла не много, но Вы правы - почитать о транзакциях стоит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&mobile=1&tid=2145073]: |
0ms |
get settings: |
20ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
68ms |
get topic data: |
23ms |
get forum data: |
6ms |
get page messages: |
105ms |
get tp. blocked users: |
3ms |
| others: | 345ms |
| total: | 609ms |

| 0 / 0 |
