Обсуждение: ResultSet & setFetchSize fails to stop heap failures
The resultset is a very large set of rows ( each row 2 ints and a
bunch of doubles ) . I am unable to convince jdbc to fetch one row at
a time, and avoid the heap failure.
Is there a way, or just a bug, or feature deficiency?
String s = "Select tzids, tzide, latlonpoints from " + tableName;
ResultSet rSet;
try {
Statement select = sqlConnection.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
select.setFetchSize( 1 );
rSet = select.executeQuery(s); <==========================
rSet.setFetchSize(1);
} catch ( Exception e ) { e.printStackTrace(); rSet = null; }
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at
org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1309)
at
org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:336)
at
org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:235)
at UpdateNodeNumbers.getAllTzid(UpdateNodeNumbers.java:78)
at UpdateNodeNumbers.<init>(UpdateNodeNumbers.java:34)
at TestShapefile.test(TestShapefile.java:63)
at TestShapefile.main(TestShapefile.java:50)
On Wed, 28 May 2008, U. George wrote: > The resultset is a very large set of rows ( each row 2 ints and a > bunch of doubles ) . I am unable to convince jdbc to fetch one row at > a time, and avoid the heap failure. > Is there a way, or just a bug, or feature deficiency? To do partial fetches you must turn autocommit off. See: http://jdbc.postgresql.org/documentation/83/query.html#query-with-cursor Kris Jurka
To do partial fetches you must turn autocommit off. See: > > http://jdbc.postgresql.org/documentation/83/query.html#query-with-cursor > > Kris Jurka Yup, that did it. I suppose there is a reason why no exception is thrown at the execute, or an error for the setFetchSize when autocommit is still on?
On Wed, 28 May 2008, U. George wrote: >> To do partial fetches you must turn autocommit off. See: >> > > Yup, that did it. I suppose there is a reason why no exception is > thrown at the execute, or an error for the setFetchSize when autocommit > is still on? > You can't throw an exception at setFetchSize because you could do setFetchSize(N) and then setAutoCommit(false). Throwing an exception at execute time is possible, but I don't think the driver should. Fetch size is just a hint, so it's not a failure if it isn't used. Kris Jurka