Re: Re: HELP: How to tame the 8.3.x JDBC driver with a biq guery result set - Mailing list pgsql-performance

From Scott Carey
Subject Re: Re: HELP: How to tame the 8.3.x JDBC driver with a biq guery result set
Date
Msg-id 3B517B10-980D-447E-9C51-1C3222526E33@richrelevance.com
Whole thread Raw
In response to Re: HELP: How to tame the 8.3.x JDBC driver with a biq guery result set  (Dave Crooke <dcrooke@gmail.com>)
List pgsql-performance
On Apr 15, 2010, at 1:01 PM, Dave Crooke wrote:
> On Thu, Apr 15, 2010 at 2:42 PM, Dave Crooke <dcrooke@gmail.com> wrote:
> Hey folks
>
> I am trying to do a full table scan on a large table from Java, using a straightforward "select * from foo". I've run
intothese problems: 
>
> 1. By default, the PG JDBC driver attempts to suck the entire result set into RAM, resulting in
java.lang.OutOfMemoryError... this is not cool, in fact I consider it a serious bug (even MySQL gets this right ;-) I
amonly testing with a 9GB result set, but production needs to scale to 200GB or more, so throwing hardware at is is not
feasible.
>

For scrolling large result sets you have to do the following to prevent it from loading the whole thing into memory:


Use forward-only, read-only result scrolling and set the fetch size.  Some of these may be the default depending on
whatthe connection pool is doing, but if set otherwise it may cause the whole result set to load into memory.  I
regularlyread several GB result sets with ~10K fetch size batches. 

Something like:
Statement st =  conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)
st.setFetchSize(FETCH_SIZE);



> 2. I tried using the official taming method, namely java.sql.Statement.setFetchSize(1000) and this makes it blow up
entirelywith an error I have no context for, as follows (the number C_10 varies, e.g. C_12 last time) ...  
>
> org.postgresql.util.PSQLException: ERROR: portal "C_10" does not exist
>     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
>     at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
>     at org.postgresql.core.v3.QueryExecutorImpl.fetch(QueryExecutorImpl.java:1527)
>     at org.postgresql.jdbc2.AbstractJdbc2ResultSet.next(AbstractJdbc2ResultSet.java:1843)
>
> This is definitely a bug :-)
>
>

I have no idea what that is.

> Is there a known workaround for this ... will updating to a newer version of the driver fix this?
>
> Is there a magic incation of JDBC calls that will tame it?
>
> Can I cast the objects to PG specific types and access a hidden API to turn off this behaviour?
>
> If the only workaround is to explicitly create a cursor in PG, is there a good example of how to do this from Java?
>
> Cheers
> Dave
>
>
>
>
>
>


pgsql-performance by date:

Previous
From: Matthew Wakeling
Date:
Subject: Re: Planner not using column limit specified for one column for another column equal to first
Next
From: Dave Crooke
Date:
Subject: Getting rid of a cursor from JDBC .... Re: Re: HELP: How to tame the 8.3.x JDBC driver with a biq guery result set