powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC out of memory
23 сообщений из 23, страница 1 из 1
JDBC out of memory
    #34679445
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
У меня возникла следующая проблема, но я даже не знаю в какую сторону копать.

Есть метод, который производит выгрузку результата работы запроса в plain-text файл.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
PreparedStatement stmt = session.getSession().connection().prepareStatement(sql);
...
rs = stmt.executeQuery();
...
 while (rs.next())
{
	 for  ( int  i =  1 ; i < rs.getMetaData().getColumnCount()+ 1  ; ++i)
	{
		s = rs.getString(i);
		bw.write(s);
	}
	bw.write('\n');
}


Всё отлично работает, до тех пор пока я не стал получать в результате запроса много данных. На данный момент это 1,5М строк по 800 байт каждая.
В этом случае вызов
Код: plaintext
rs = stmt.executeQuery();
приводит к Out of Memory error
На сколько я понимаю он пытаеться подтянуть все данные на клиент, чем и убивает JVM.
Можно ли как-то заставить JDBC открыть курсор на стороне БД, и считывать данные непосредственно при вызове, например, rs.next() ?

Спасибо.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679563
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает оптимизировать SQL запрос, чтобы он возвращал ограниченное количество результатов?
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679621
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужны все эти строки.
Или я Вас не правильно понял?
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679636
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а по кусочкам запрашивать слабо ?

ну и можно с типами курсоров поигратьсо. хотя всё от конкретного драйвера зависит
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679655
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679673
Фотография Хрюхрюшкин.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто.
Пробовали
Код: plaintext
1.
preparedStatement.setFetchSize(...);
?
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679807
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
- а что за база?
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679818
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хрюхрюшкин. preparedStatement.setFetchSize(...);
Попробовал. Результат тот-же. мои JDBC драйвера (Pоstgres 8.2) вообще ИМХО не реагируют на этот параметр :(
...
Рейтинг: 0 / 0
JDBC out of memory
    #34679872
Ekshibarov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Angel13 Хрюхрюшкин. preparedStatement.setFetchSize(...);
Попробовал. Результат тот-же. мои JDBC драйвера (Pоstgres 8.2) вообще ИМХО не реагируют на этот параметр :(

Сделай autocommit у соединения в false.

http://jdbc.postgresql.org/documentation/82/query.html
Смотри секцию "Getting results based on a cursor".
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680003
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто.

LIMIT, OFFSET и COUNT
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680654
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov Angel13По кусочкам слабо, так как чтоб запрашивать по кусочкам мне придется каждый раз сортировать выборку. А это достаточно медленно. Тем более если делать это часто.

LIMIT, OFFSET и COUNT очень плохой вариант

ИМХО курсоры - это то, что нужно
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680731
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dan Blackочень плохой вариант
- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680746
Фотография Хрюхрюшкин.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера.
Лучше использовать курсоры. Я думаю, что драйвер их должен поддерживать.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680777
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера.

Плохой тем, что если у меня в таблице 20 записей и я пишу

Код: plaintext
1.
select * from dummy
offset  1  limit  10 

а потом

Код: plaintext
1.
select * from dummy
offset  10  limit  20 

то нет никакой гарантии что полученные наборы будут равны :

Код: plaintext
1.
select * from dummy
offset  1  limit  20 

Чтобы такого не было нужно сортировать - а это на больших данных очень дорого.
Плюс ко всему за промежуток время между считываниями данные могут уже поменяться.

Ekshibarov Vladimir http://jdbc.postgresql.org/documentation/82/query.html
Смотрю, похоже то, что нужно...
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680784
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov- чем плохой? по моему, простой и надежный и вполне подходящий к задаче, а поддержка курсоров сильно зависит от реализации драйвера.
плох по ресурсоёмкости при больших и сложных выборках
+ результат при такой выборке может изменяться другими параллельно работающими запросами, то есть конечное количество строк в итоге неопределено
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680804
carper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Angel13Всем привет!
У меня возникла следующая проблема, но я даже не знаю в какую сторону копать.
Всё отлично работает, до тех пор пока я не стал получать в результате запроса много данных. На данный момент это 1,5М строк по 800 байт каждая.
В этом случае вызов
Код: plaintext
rs = stmt.executeQuery();
приводит к Out of Memory error
На сколько я понимаю он пытаеться подтянуть все данные на клиент, чем и убивает JVM.
Можно ли как-то заставить JDBC открыть курсор на стороне БД, и считывать данные непосредственно при вызове, например, rs.next() ?
Спасибо.

IMHO если не использовать обновляемые и двунаправленные курсоры, то ничего на клиента тянутся без спроса (ну разве что + fetch size) не будет.

Попробуйте, может тут собака порылась?
...
Рейтинг: 0 / 0
JDBC out of memory
    #34680974
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13Чтобы такого не было нужно сортировать - а это на больших данных очень дорого.
Плюс ко всему за промежуток время между считываниями данные могут уже поменяться.

- на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу

- гарантией неизменности данных будет использование транзакций (кстати почему Вы думаете что использование курсора гаранирует неизменность данных? опять же это сильно зависит от реализации драйвера)

Dan Blackплох по ресурсоёмкости при больших и сложных выборках
- возможно, но запрос один и тот же и если использовать preparedStatement возможно (зависит от реализации драйвера и возможностей базы) проблем не будет. Кроме того точно не будет проблем с памятью в JVM. Т. е. тут надо определиться кому должно быть "плохо": приложению или БД :)


Dan Black
результат при такой выборке может изменяться другими параллельно работающими запросами, то есть конечное количество строк в итоге неопределено
- транзакции
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681090
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсоры и подразумевают транзакции.
preparedStatement больше зависит от возможностей базы и выигрыш от его использования в теории не сравнится с выигрышом от использования курсоров. К тому же речь идёт об определенной БД, поэтому ссылаться на возможности и фишки других баз данных не имеет смысла.

Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681211
Angel13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу

Совсем нет.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681329
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу

Совсем нет.
- Вы правы
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681334
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу

Совсем нет.
+1.
Причем это написано в той сцылке которую ты дал.
Kachalov- гарантией неизменности данных будет использование транзакций (кстати почему Вы думаете что использование курсора гаранирует неизменность данных? опять же это сильно зависит от реализации драйвера)
По дефолту результаты выборки из курсора консистентны на момент его открытия (по крайней мере при беглом осмотре доки PostgreSQL, я это понял так). В случае использования нескольких запросов - такого не будет.
Kachalov- транзакции
Наверно стоит вначале что-нибудь о них почитать.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681382
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Timm Angel13 Kachalov - на запросе SELECT * без доп. условий, данные уже отсортированы - по ключу

Совсем нет.
+1.

- и Вы правы

Timm
Kachalov- транзакции
Наверно стоит вначале что-нибудь о них почитать.
- что то грубовато и смысла не много, но Вы правы - почитать о транзакциях стоит.
...
Рейтинг: 0 / 0
JDBC out of memory
    #34681401
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- что то грубовато
Нет, не думаю.
Kachalov
и смысла не много
Аргумент "- транзакции" аналогично.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JDBC out of memory
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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