Yes, you're right about the "lots and lots of different kinds of stuff" :)

The root of the problem with queryWithRowHandler(callback) is that it's based 
on internal iterator and framework expects external iterator. Using some 
continuations voodoo it might be possible to make an external iterator from the 
internal one, but that would be an overkill + probably wildly ineffective and 
therefore unusable for batch processing where good performance is necessary.

Robert

-----Original Message-----
From: Christopher Lamey [mailto:[EMAIL PROTECTED]
Sent: Thu 10/4/2007 5:37 PM
To: user-java@ibatis.apache.org
Subject: Re: how to map huge resultsets?
 
I think the issue is that the RowHandler would need to call back to the
framework code, which might decide to not continue processing or roll the
transaction back or do any number of things.

My guess is that this loop:

while (itemProvider.hasNext()) {
  Object item = itemProvider.next ();
  process(item);
}

Is more like this:

[...]
Set up state
[...]
while (itemProvider.hasNext()) {
    Object item = itemProvider.next ();
    [...]
    do lots and lots of different kinds of stuff
    [...]
}
[...]
Tear down state
[...]

So unless the framework has a callback to "do lots and lots of different
kinds of stuff in the framework state", it would be hard to replicate that
in the RowHandler in a generic way.

In other words, you can't have an object implement Iterator and RowHandler
and have it work like an Iterator.

Cheers,
Chris

Since iBATIS calls RowHandler.handleRow,

On 10/4/07 8:13 AM, "Jean-Francois Poilpret" <[EMAIL PROTECTED]> wrote:

> As far as I understand what you need, I do believe that the RowHandler
> approach is suitable. However, your RowHandler has to be a bit smarter than
> the typical RowHandler. Since RowHandler is a class instance, it may have
> data members in which you store the currently handled row to compare with
> the next row (on next call, so). I don't see, from your description, what
> could prevent you from going that way.
> 
>  
> 
> Cheers
> 
>  
> 
> Jean-Francois
> 
>  
> 
>   _____  
> 
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
> 
> Sent: Thursday, October 04, 2007 8:43 PM
> To: user-java@ibatis.apache.org
> Subject: RE: how to map huge resultsets?
> 
>  
> 
> Thanks for the insights Jeff.
> 
>  
> 
> Shifting a paradigm and letting iBATIS control the flow is not an option
> this case, but I think iBATIS can still be used in a slightly different
> "driving query" scenario. In this case a "driving query" is run first which
> retrieves all primary keys. When framework asks for next item, the item
> provider takes the next key and asks iBATIS for the corresponding object -
> it is not what I was originally looking for, but still useful.
> 
>  
> 
> Btw. the motivation for my post is to figure out how ibatis can be
> integrated as an input source for the emerging Spring-Batch framework. It
> provides support for ordinary sql with manual mapping, but supporting ORM
> frameworks (especially Hibernate & iBATIS) would be a valuable addition.
> 
>  
> 
> Robert
> 
>  
> 
>   _____  
> 
> From: Jeff Butler [mailto:[EMAIL PROTECTED]
> Sent: Thursday, October 04, 2007 14:15
> To: user-java@ibatis.apache.org
> Subject: Re: how to map huge resultsets?
> 
>  
> 
> Your question is not that confusing.  Here are the answers:
> 
>  
> 
> 1. No (although the approach suggested by Christopher Lamey is very close if
> you are willing to shift your paradigm)
> 
>  
> 
> 2. If the result set is truly huge, then approach #1 is a bad idea because
> iBATIS will have to read through huge amounts of data to get to the latter
> parts of the result set in subsequent calls (this is why Larry asked about
> selecting by primary key rather than returning such a huge result set)
> 
>  
> 
> I guess you'll have to stick with Hibernate :)
> 
>  
> 
> Jeff Butler
> 
>  
> 
> On 10/4/07, [EMAIL PROTECTED] <[EMAIL PROTECTED] >
> wrote: 
> 
> Seems like my question was quite confusing, so I'll try to explain what
> I need once again from scratch.
> 
> 1. I need to process a potentially huge number of rows (so
> queryForList(query) is not an option because it would try to load all
> objects into memory at once).
> 
> 2. I need to control the iteration over the query results, so I can't
> use queryWithRowHandler (in this case iBATIS iterates and I only tell
> iBATIS how each record should be processed - I need to be able to ask
> iBATIS for the next record instead - it is the internal vs. external
> iterator difference, or SAX vs. StAX in case of XML processing or how
> collections are typically iterated in ruby/groovy vs. Java or ... you
> name it). Simply framework iterates, iBATIS knows the query and must
> provide next record when it is asked for it.
> 
> First approach:
> It is possible to implement these requirements by using
> queryForList(query, skipSize, maxSize) and  query the database
> TOTAL_ROW_COUNT / maxSize times (issuing a new query when records from
> current list have been processed - this is invisible to the user
> (framework) who just iteratively asks for next record for processing).
> 
> Second approach:
> Hibernate allows to get a ScrollableResults object for a query allowing
> the user to move the cursor and ask for an object that corresponds to
> the current row.
> 
> Questions:
> 1. is the second approach possible with iBATIS?
> 2. first vs. second approach pros & cons?
> 
> Thanks 
> Robert
> 
> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf
> Of Larry Meadors 
> Sent: Thursday, October 04, 2007 01:18
> To: user-java@ibatis.apache.org
> Subject: Re: how to map huge resultsets?
> 
> I'm confused, how would grabbing chunks of a huge result set be more
> efficient than grabbing the records by PK?
> 
> Couldn't you just have a select that grabbed the requested item, and
> passed it back to the consumer?
> 
> Larry
> 
> 
> On 10/3/07, [EMAIL PROTECTED]
> <[EMAIL PROTECTED]> wrote:
>> My problem with RowHandler is that iBATIS controls the iteration. I
> just say 
>> 
>> sqlMap.queryWithRowHandler ("getAllItems", rowHandler);
>> 
>> and all items get processed by the rowHandler.
>> 
>> But in my case I need to make iBATIS return items one-by-one when it
> is asked to do so because the framework controls the iteration.
>> This is a very simplified basic logic of the framework:
>> 
>> while (itemProvider.hasNext()) {
>>  Object item = itemProvider.next ();
>>  process(item);
>> }
>> 
>> 
>> 
>> -----Original Message-----
>> From: Christopher Lamey [mailto:[EMAIL PROTECTED]
>> Sent: Wed 10/3/2007 11:55 PM
>> To: user-java@ibatis.apache.org
>> Subject: Re: how to map huge resultsets?
>> 
>> Hmm...I don't see how having an external framework prevents you from
> using a
>> RowHandler.  Your item provider could implement the RowHandler
> interface and
>> the external code wouldn't know or care about it.  Or your item
> provider
>> could wrap something that does implement RowHandler so the external
> code
>> doesn't know it exists.  The main point is that you can pull mapped
> objects
>> on a row by row basis from the database.
>> 
>> How is a RowHandler different that what you were describing in your
> first
>> mail?
>> 
>> On 10/3/07 3:33 PM, "[EMAIL PROTECTED]"
>> <[EMAIL PROTECTED] > wrote:
>> 
>>> 
>>> Thanks for your reply.
>>> 
>>> I can't use the rowhandler callback because the iteration is
> external to
>>> iBATIS. In my case a batch framework iteratively asks for an item
> and
>>> processes it - and I am trying to implement an iBATIS item provider
> (I realize
>>> now I should have explained this in the initial post).
>>> 
>>> Robert
>>> 
>>> 
>>> -----Original Message-----
>>> From: Christopher Lamey [mailto:[EMAIL PROTECTED]
>>> Sent: Wed 10/3/2007 11:06 PM
>>> To: user-java@ibatis.apache.org
>>> Subject: Re: how to map huge resultsets?
>>> 
>>> Hello,
>>> 
>>> You should take a look at the RowHandler interface and the
>>> queryWithRowHandler calls in SqlMapClient (page 61 of the pdf).
> Basically,
>>> the RowHandler gets invoked for every row returned rather than
> mapping all
>>> the rows into objects in a collection.
>>> 
>>> Cheers,
>>> Chris
>>> 
>>> 
>>> On 10/3/07 2:37 PM, "[EMAIL PROTECTED]"
>>> <[EMAIL PROTECTED] > wrote:
>>> 
>>>> Hello,
>>>> 
>>>> I am wondering whether it possible to implement the following
> scenario with
>>>> iBATIS:
>>>> 
>>>>    1. run an iBATIS-managed select
>>>>    2. get a scrollable result set instead of a list of mapped
> objects
>>>>    3. manually scroll the result set and ask iBATIS for object
> corresponding
>>>> to current row
>>>> 
>>>> Hibernate provides this possibility
>>>> (http://www.hibernate.org/hib_docs/reference/en/html/batch.html ) so
> I thought
>>>> it would be feasible with iBATIS too, but I couldn't figure out a
> way. The
>>>> motivation is a batch scenario where the select returns a huge
> number of rows
>>>> so all mapped objects can't be loaded into memory at once.
>>>> 
>>>> The iBATIS way I am aware of is to use queryForList(String
> statementName, int
>>>> skipResults, int maxResults), but this means querying the database
>>>> (TOTAL_NUMBER_OF_ROWS / maxResults) times.
>>>> 
>>>> Can somebody give advice about pros & cons of the two approaches?
>>>> 
>>>> Thanks
>>>> Robert
>>>> 
>>>> 
>>>> This message is for the designated recipient only and may contain
> privileged,
>>>> proprietary, or otherwise private information.  If you have
> received it in
>>>> error, please notify the sender immediately and delete the
> original.  Any
>>>> other use of the email by you is prohibited.
>>> 
>>> 
>>> 
>>> 
>>> This message is for the designated recipient only and may contain
> privileged,
>>> proprietary, or otherwise private information.  If you have received
> it in
>>> error, please notify the sender immediately and delete the original.
> Any
>>> other use of the email by you is prohibited.
>> 
>> 
>> 
>> 
>> This message is for the designated recipient only and may contain
> privileged, proprietary, or otherwise private information.  If you have
> received it in error, please notify the sender immediately and delete
> the original.  Any other use of the email by you is prohibited.
>> 
>> 
> 
> 
> This message is for the designated recipient only and may contain
> privileged, proprietary, or otherwise private information.  If you have
> received it in error, please notify the sender immediately and delete the
> original.  Any other use of the email by you is prohibited.
> 
>  
> 
> This message is for the designated recipient only and may contain
> privileged, proprietary, or otherwise private information. If you have
> received it in error, please notify the sender immediately and delete the
> original. Any other use of the email by you is prohibited.
> 




This message is for the designated recipient only and may contain privileged, 
proprietary, or otherwise private information.  If you have received it in 
error, please notify the sender immediately and delete the original.  Any other 
use of the email by you is prohibited.

<<winmail.dat>>

Reply via email to