Я пытаюсь предварительно генерировать отчеты из очень большой таблицы (300 ГБ) в PostgreSQL. Я делаю что-то вроде этого:java.lang.OutOfMemoryError при чтении из большой таблицы
rs = stmt.executeQuery("SELECT * FROM tbl");
System.out.println("select all finished");
while (rs.next()) {
/* generate report and save it in report table */
/* generated reports are not in memory,
* They are saved in a summary table in each iteration */
}
При запуске приложения оно дает Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
. Я пытался использовать stmt.setFetchSize(1000)
Но это не решает проблему.
Какое решение? Я использую PostgreSQL 8.4.11 на Debian 6.0.5 и OpenJDK 6.
[UPDATE]
Напечатанный трассировки стека показывает, что OutOfMemoryError
исключение было сгенерировано в rs = stmt.executeQuery("SELECT * FROM tbl");
линии. Также System.out.println("select all finished");
никогда не показывает.
- Я работаю в
autocommit
режиме. stmt.getResultSetConcurrency()
возвращает 1007.stmt.getResultSetHoldability()
возвратные 2.rs.getType()
возвращает 1003.
Вам действительно нужны все столбцы ...? – bernie
Решение использует меньше памяти –
Каков тип результатов и устойчивость? Выполняется ли с помощью автоматической фиксации или без нее? –