You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@commons.apache.org by Robert Huffman <ro...@gmail.com> on 2019/03/06 17:55:38 UTC

[dbutils]

I like DbUtils QueryRunner, but the thing that has always bothered me is
that it forces me to read the entire ResultSet into memory rather than
allowing me to use cursors. So I developed a little library to do that,
which I called dbstream, which is on GitHub:
https://github.com/rhuffman/dbstream/

It provides an abstract StreamingResultSetHandler that will return a
Stream<T>, which each element is built from one row of the query. It
utilizes cursors by keeping the ResultSet (and underlying Connection) open
until the Stream is closed. There are three concrete subclasses of the
handler:

   - ArrayStreamingHandler: returns a Stream<Object[]>, where each Object[]
   is the values from a row of the result
   - ObjectStreamingHandler: returns a Stream<Object>, where each object is
   a bean built from a row of the result
   - MapStreamingHandler: returns a Stream<Map<String,Object>>, where each
   object is a map of column names and values built from a row of the result

Of course, the QueryRunner.query methods close their database objects
before returning, so I needed different query methods to execute the query.
I extended QueryRunner to create StreamingQueryRunner with these two
methods:

   - public <T> Stream<T> queryAsStream(
       String sql,
       StreamingResultSetHandler<T> handler,
       Object... args)

   - public <T> Stream<T> queryAsStream(
       Connection connection,
       String sql,
       StreamingResultSetHandler<T> handler,
       Object... args)


I'm probably going to publish it to Maven Central. However, would the
DbUtils developers be amenable to doing something like this directly in
DbUtils? I could integrate the work into DbUtils and give you a pull
request. It might take me a bit because I would have to convert the tests
from Spock, but it wouldn't be too bad.

Re: [dbutils]

Posted by Remko Popma <re...@gmail.com>.
Is there really a need to rewrite Spock tests to another testing framework?

Remko.

(Shameless plug) Every java main() method deserves http://picocli.info

> On Mar 7, 2019, at 6:25, Gary Gregory <ga...@gmail.com> wrote:
> 
> Robert,
> 
> This seems like a fine addition to DbUtils. I'd love to see a PR on GitHub.
> Adding more documentation would be nice. WRT bringing this into DbUtils,
> can we avoid adding a new interface by using Java 8 default methods
> on QueryRunner? If DbUtils is not on Java 8, we can bring it up to Java 8.
> 
> Gary
> 
> On Wed, Mar 6, 2019 at 1:05 PM Robert Huffman <ro...@gmail.com>
> wrote:
> 
>> I like DbUtils QueryRunner, but the thing that has always bothered me is
>> that it forces me to read the entire ResultSet into memory rather than
>> allowing me to use cursors. So I developed a little library to do that,
>> which I called dbstream, which is on GitHub:
>> https://github.com/rhuffman/dbstream/
>> 
>> It provides an abstract StreamingResultSetHandler that will return a
>> Stream<T>, which each element is built from one row of the query. It
>> utilizes cursors by keeping the ResultSet (and underlying Connection) open
>> until the Stream is closed. There are three concrete subclasses of the
>> handler:
>> 
>>   - ArrayStreamingHandler: returns a Stream<Object[]>, where each Object[]
>>   is the values from a row of the result
>>   - ObjectStreamingHandler: returns a Stream<Object>, where each object is
>>   a bean built from a row of the result
>>   - MapStreamingHandler: returns a Stream<Map<String,Object>>, where each
>>   object is a map of column names and values built from a row of the
>> result
>> 
>> Of course, the QueryRunner.query methods close their database objects
>> before returning, so I needed different query methods to execute the query.
>> I extended QueryRunner to create StreamingQueryRunner with these two
>> methods:
>> 
>>   - public <T> Stream<T> queryAsStream(
>>       String sql,
>>       StreamingResultSetHandler<T> handler,
>>       Object... args)
>> 
>>   - public <T> Stream<T> queryAsStream(
>>       Connection connection,
>>       String sql,
>>       StreamingResultSetHandler<T> handler,
>>       Object... args)
>> 
>> 
>> I'm probably going to publish it to Maven Central. However, would the
>> DbUtils developers be amenable to doing something like this directly in
>> DbUtils? I could integrate the work into DbUtils and give you a pull
>> request. It might take me a bit because I would have to convert the tests
>> from Spock, but it wouldn't be too bad.
>> 

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@commons.apache.org
For additional commands, e-mail: user-help@commons.apache.org


Re: [dbutils]

Posted by Gary Gregory <ga...@gmail.com>.
Robert,

This seems like a fine addition to DbUtils. I'd love to see a PR on GitHub.
Adding more documentation would be nice. WRT bringing this into DbUtils,
can we avoid adding a new interface by using Java 8 default methods
on QueryRunner? If DbUtils is not on Java 8, we can bring it up to Java 8.

Gary

On Wed, Mar 6, 2019 at 1:05 PM Robert Huffman <ro...@gmail.com>
wrote:

> I like DbUtils QueryRunner, but the thing that has always bothered me is
> that it forces me to read the entire ResultSet into memory rather than
> allowing me to use cursors. So I developed a little library to do that,
> which I called dbstream, which is on GitHub:
> https://github.com/rhuffman/dbstream/
>
> It provides an abstract StreamingResultSetHandler that will return a
> Stream<T>, which each element is built from one row of the query. It
> utilizes cursors by keeping the ResultSet (and underlying Connection) open
> until the Stream is closed. There are three concrete subclasses of the
> handler:
>
>    - ArrayStreamingHandler: returns a Stream<Object[]>, where each Object[]
>    is the values from a row of the result
>    - ObjectStreamingHandler: returns a Stream<Object>, where each object is
>    a bean built from a row of the result
>    - MapStreamingHandler: returns a Stream<Map<String,Object>>, where each
>    object is a map of column names and values built from a row of the
> result
>
> Of course, the QueryRunner.query methods close their database objects
> before returning, so I needed different query methods to execute the query.
> I extended QueryRunner to create StreamingQueryRunner with these two
> methods:
>
>    - public <T> Stream<T> queryAsStream(
>        String sql,
>        StreamingResultSetHandler<T> handler,
>        Object... args)
>
>    - public <T> Stream<T> queryAsStream(
>        Connection connection,
>        String sql,
>        StreamingResultSetHandler<T> handler,
>        Object... args)
>
>
> I'm probably going to publish it to Maven Central. However, would the
> DbUtils developers be amenable to doing something like this directly in
> DbUtils? I could integrate the work into DbUtils and give you a pull
> request. It might take me a bit because I would have to convert the tests
> from Spock, but it wouldn't be too bad.
>