Re: Memory exeception - Mailing list pgsql-jdbc

From Barry Lind
Subject Re: Memory exeception
Date
Msg-id 3BEAC8C7.1060306@xythos.com
Whole thread Raw
In response to Memory exeception  (Peter Wasem <peter.wasem@itag.ch>)
List pgsql-jdbc
Peter,

You certainly can do this with java.  I do in my code in many places.
Consider the following example that processes all rows in the table
'bar' by fetching 10 rows at a time.

thanks,
--Barry

PreparedStatement l_cursorstmt = connection.PrepareStatement("declare
foo_cursor cursor for select foo from bar");
PreparedStatement l_fetchstmt = connection.PrepareStatement("fetch
forward 10 from foo_cursor");

//open the cursor
l_cursorstmt.execute();

ResultSet l_rset;
int l_count;
do {
   //continue looping until you get no rows returned in a fetch
   l_count = 0;
   //fetch rows from the cursor using the fetch statement
   l_rset = l_fetchstmt.executeQuery();
   while (l_rset.next) {
     l_count++;
     //process the rows here
   }
} while (l_count > 0);

//don't forget to close the cursor
PreparedStatement l_closestmt = connection.PrepareStatement("close
foo_cursor");
l_closestmt.execute();




Peter Wasem wrote:

> Hi Barry
>
> This is exactly what I observed. The physical memory dropped down to almost
> zero (but no swap was used) before the exception was thrown. I'm not sure if I
> can use cursors (other than ResultSet) since my application is Java-based.
>
> Thanks
>
> Barry Lind wrote:
>
>
>>Peter,
>>
>>Postgres will return the entire result into memory first before
>>processing the first row of data.  If you don't want this behavior you
>>should use explicit cursors and fetch statements to get data a few rows
>>at a time.  See the postgres documentation on the 'cursor' and 'fetch'
>>sql statements.
>>
>>thanks,
>>--Barry
>>
>>Peter Wasem wrote:
>>
>>
>>>Hi
>>>
>>>I have a problem in processing large numbers of rows in ResultSets.
>>>Here's the code fragment where the problem occurs:
>>>
>>>...
>>>    ResultSet rset = stmt.executeQuery( "select ... from ... where ...
>>>order by ..." ) ;
>>>    while(rset.next() )
>>>    { // Process the row }
>>>...
>>>
>>>The query addresses some 100'000 rows. When stmt.executeQuery() is
>>>executed suddenly an exception occurs.
>>>The same program works fine with other JDBC drivers.
>>>
>>>Any ideas ?
>>>
>>>Greetings
>>>Peter
>>>
>>>---------------------------(end of broadcast)---------------------------
>>>TIP 2: you can get off all lists at once with the unregister command
>>>    (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)
>>>
>>>



pgsql-jdbc by date:

Previous
From: Ned Wolpert
Date:
Subject: Re: [HACKERS] MD5-based passwords
Next
From: Barry Lind
Date:
Subject: Re: Connection and Statement