Hi,

Thank you for your quick reply.

I will elaborate a little on my question:

I often need to retrieve a large amount of data from a remote MySQL database. However, if my application runs with a default heap size, then i will quickly get some sort of heap space exception. The reason is that the ResultSet containing the retrieved data is too large. What i have done to get around this is to stream the results from the database, and process rows one by one as they are streamed (for instance, storing them in a local database, like Derby). Of course, things are most likely behaving more optimal than only transfering one row at a time from the database (yes, some buffers are most likely involved). However, my key point was that i do not have to wait for the entire ResultSet to become ready before i can start iterating over the rows. Instead, rows (
be it one or hundred) are retrieved as i iterate over the ResultSet.

So, my question is wether the Derby Driver has this ability too?

Kind regards,
Stian Brattland


My intention with the question was not really to point out that a the driver needs to retrive
results in the most ineffective manner as possible.

Bernt M. Johnsen skrev:
Hi,

Some general remarks (don't remember the exact details of what Derby
actually does with setFetchSize).

Stian Brattland wrote (2010-01-14 08:43:32):
Hi,

I've got a question regarding results streaming. The J/Connector for MySQL supports results streaming, which means that you can stream and process rows in a ResultSet one by one. Normally, all rows in a ResultSet will be retrived before you can process the ResultSet. However, i am curious as to wether this "feature" also exists in Derby?

Normally, a JDBC driver will retrieve a suitable number of rows, not
necessarily all, depending on various factors such as row size, number
of rows resulting from the query and communication buffer size.

In MySQL, you would do the following to stream results from the database as you iterate through a ResultSet:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);

setFetchSize is just a hint to the driver, See

http://jscstage.sfbay.sun.com/javase/6/docs/api/java/sql/Statement.html#setFetchSize(int)

A well written driver will still try to do thing's optimal, such as
e.g. fill up the communication buffer with rows to reduce the number
of roundtrips, regardless of how low you set the fetchSize.

And last, why would you like to force the driver to fetch the rows one
by one? The only thing you will get fromthat, is extra overhead.

Reply via email to