Java JDBC Lazy-Loaded ResultSet

Nathaniel Flath picture Nathaniel Flath · Jun 12, 2009 · Viewed 15.6k times · Source

Is there a way to get a ResultSet you obtain from running a JDBC query to be lazily-loaded? I want each row to be loaded as I request it and not beforehand.

Answer

Matt Solnit picture Matt Solnit · Jun 12, 2009

Short answer:

Use Statement.setFetchSize(1) before calling executeQuery().

Long answer:

This depends very much on which JDBC driver you are using. You might want to take a look at this page, which describes the behavior of MySQL, Oracle, SQL Server, and DB2.

Major take-aways:

  • Each database (i.e. each JDBC driver) has its own default behavior.
  • Some drivers will respect setFetchSize() without any caveats, whereas others require some "help".

MySQL is an especially strange case. See this article. It sounds like if you call setFetchSize(Integer.MIN_VALUE), then it will download the rows one at a time, but it's not perfectly clear.

Another example: here's the documentation for the PostgreSQL behavior. If auto-commit is turned on, then the ResultSet will fetch all the rows at once, but if it's off, then you can use setFetchSize() as expected.

One last thing to keep in mind: these JDBC driver settings only affect what happens on the client side. The server may still load the entire result set into memory, but you can control how the client downloads the results.