JDBC + ResultSet = OutOfMemory

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
jags
Сообщения: 1
Зарегистрирован: 25 фев 2006, 14:32

JDBC + ResultSet = OutOfMemory

Сообщение jags » 25 фев 2006, 14:34

При использовании Firebird + JDBC + клиентская_программа_на_Java есть проблема. Если в результат select попадает очень много записей (больше 1 млн), то клиентская часть вываливается по OutOfMemory, т.к. все результаты выборки заносятся СРАЗУ (!) в ResultSet, а не достаются из БД постепенно по ResultSet.next().
Задача выбрать все записи подряд (простой select * from table).
Вижу 2 решения:
1) выводить кусками по 100 тысяч через select first 100000 skip X ...
недостаток: линейное увеличение времени выборки при увеличении X (пока дойдем до конца базы время выборки увеличивается с 10 сек на 100 тыс до 10 мин на 100 тыс)
2) выводить кусками по 100 тысяч через (id_table>Xmin) and (id_table<Xmax)
недостаток: нужно очень аккуратно следить за id_table, хотя время запроса в этом случае всегда одинаковое
Понимаю, что проблема в JDBC, т.к. оно не может выбирать из БД постепенно. Как ее решать?
Использую Firebird 2.0 + jaybird + JDK1.4.2 + Linux

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 фев 2006, 14:36

я скоро начну банить за размещение ОДИНАКОВЫХ вопросов тут и на sql.ru.

Ответить