oops.. not at release() but instead at doEndTag()

I've tested it and it works like charm.. now I can just pass the
results on to the view returned by getIteratorByQuery to be iterated
there..

On Thu, 14 Oct 2004 12:04:13 +0800, [ Muliawan Sjarif ]
<[EMAIL PROTECTED]> wrote:
> what I did was to close PersistenceBroker at struts' release() method
> of IteratorTag since I'm using logic:iterate
> 
> anybody see any flaw for this?
> 
> 
> 
> On Wed, 13 Oct 2004 15:51:05 -0600, Steve Clark
> <[EMAIL PROTECTED]> wrote:
> > Doh!
> >
> > Yes, of course BrokerClosingIterator should implement Iterator.  That
> > was the whole point; my bad.
> >
> > Also, re: failing to close.  It's true that if an error occurs, or
> > even if the caller just abandons the Iterator, then the broker might
> > not get closed.  A timeout would help here; I've also been known to
> > close the broker in a finalizer (which again is not guaranteed to run,
> > but it helps the odds).
> >
> > --
> > Steve Clark
> > Technology Applications Team
> > Natural Resources Research Center/USGS
> > [EMAIL PROTECTED]
> > (970)226-9291
> >
> > >>>>> Phil Whirlycott  writes:
> >
> >    phil> That's a clever approach.  Shouldn't you also implement
> >    phil> Iterator on this?  Also, if an exception occurs during the
> >    phil> processing in the view layer, it's possible that this might
> >    phil> not be properly closed.  Not sure how you account for that?
> >
> >    phil> phil.
> >
> > Steve Clark wrote:
> >
> >    >> Another alternative is for the database layer to wrap the
> >    >> Iterator and to defer calling broker.close().  The wrapper then
> >    >> either closes the broker in next() when the underlying Iterator
> >    >> is exhausted, or sets a timeout and closes the broker when it
> >    >> expires.  I've used this technique to pass OJB's result
> >    >> Iterators to my view layer.  Here's pseudocode to illustrate:
> >    >>
> >    >>     queryResults = doQuery(broker, ...);
> >    >>     return new BrokerClosingIterator(broker, queryResults);
> >    >> }
> >    >>
> >    >> class BrokerClosingIterator {
> >    >>     public BrokerClosingIterator(PersistenceBroker broker, Iterator iter) {
> >    >>         // optionally set timeout
> >    >>     }
> >    >>     public boolean hasNext() {
> >    >>         boolean more = iter.hasNext();
> >    >>         if (!more && (broker != null)) {
> >    >>             broker.close();
> >    >>             broker = null;
> >    >>         }
> >    >>         return more;
> >    >>     }
> >    >>     public Object next() {
> >    >>         return iter.next();
> >    >>     }
> >    >> }
> >    >>
> >    >>
> >    >>>>>>> Phil Whirlycott writes:
> >    >>
> >    >>
> >    phil> I was thinking about this some more on the way to work
> >    phil> today, but before I offer up the idea I had, I will first
> >    phil> re-iterate that this is probably a bad solution to whatever
> >    phil> you are trying to do.
> >    >>
> >    phil> (If you can't fit all the data in memory, what do you expect
> >    phil> a web browser to do with it?  Concurrent requests?)
> >    >>
> >    phil> Anyway, you are right about the lack of clean separation
> >    phil> between your MVC layers.  Ideally, you would just pass the
> >    phil> data in the request scope from your M to your C to your V.
> >    phil> However, you've already pointed out that it's too big.  To
> >    phil> that, we all suggested an Iterator.  And you've rightly
> >    phil> poined out that you can't really pass an Iterator into your
> >    phil> view, because the broker handling the underlying Connection
> >    phil> will likely be closed at that point.
> >    >>
> >    phil> So, what you could do is make a servlet filter that does
> >    phil> this:
> >    >>
> >    phil> public void doFilter(ServletRequest request, ServletResponse
> >    phil> response, FilterChain chain) throws IOException,
> >    phil> ServletException {
> >    >>
> >    phil> //Before...
> >    phil> MyAppFacade facade = new MyAppFacade (); Iterator i =
> >    phil> facade.getLotsAndLotsOfDataAsIterator();
> >    >>
> >    phil> //Put an Iterator in the request.
> >    phil> HttpServletRequest req = (HttpServletRequest) request;
> >    phil> req.setAttribute("mydata", i);
> >    >>
> >    phil> //Continue processing - let the view use the Iterator
> >    phil> chain.doFilter(request, response);
> >    >>
> >    phil> //Close the facade and the underlying broker.
> >    phil> facade.close();
> >    >>
> >    phil> }
> >    >>
> >    phil> Now, I don't necessarily recommend this, but it might do
> >    phil> what you are asking for.
> >    >>
> >    phil> phil.
> >    >>
> >    >>
> >    phil> [ Muliawan Sjarif ] wrote:
> >    >>
> >    >> >> I have already set maxActive=-1 in the first place.
> >    >> >>
> >    >> >> phil's right, Iterator is strongly recommended by OJB team
> >    >> >> to be used if we're dealing with huge resultset..
> >    >> >>
> >    >> >> However, the problem now is the iterator object can't be
> >    >> >> passed onto servlet or struts' view to be processed
> >    >> >> there. The documentation suggests that for that kind of
> >    >> >> purpose use Collection instead. How then?
> >    >> >>
> >    >> >> On Wed, 13 Oct 2004 13:46:31 +1000, Joe Latty
> >    >> >> <[EMAIL PROTECTED]> wrote:
> >    >> >>
> >    >> >>> Without going into why you would want a query to return
> >    >> >>> 350k records, you may have to change some parameters in the
> >    >> >>> OJB.properties file.
> >    >> >>>
> >    >> >>> Look for the following and you may need to change maxActive
> >    >> >>> to a non-positive number. This can give out of memory
> >    >> >>> errors.
> >    >> >>>
> >    >> >>> # maximum number of brokers that can be borrowed from the
> >    >> >>> # pool at one time. When non-positive, there is no limit.
> >    >> >>> maxActive=100
> >    >> >>>
> >    >> >>>
> >    >> >>>
> >    >> >>> -----Original Message----- From: WHIRLYCOTT
> >    >> >>> [mailto:[EMAIL PROTECTED] Sent: Wednesday, 13 October
> >    >> >>> 2004 12:02 PM To: OJB Users List Subject: Re: Query problem
> >    >> >>> for hundreds of thousands of records
> >    >> >>>
> >    >> >>> If you need the entire resultset in memory, you probably
> >    >> >>> need to provide
> >    >> >>>
> >    >> >>> more memory to your jvm or add more memory physically to
> >    >> >>> your hardware.
> >    >> >>>
> >    >> >>> It sounds like, in effect, that you are basically making a
> >    >> >>> copy of your database table with ~350k records in memory!
> >    >> >>>
> >    >> >>> What happens when 2 users hit your website at the same
> >    >> >>> time?  What happens when 100 users hit your site?
> >    >> >>>
> >    >> >>> I don't know the specifics of what you are doing, but it
> >    >> >>> doesn't sound like a particularily good solution.  Why do
> >    >> >>> you think you need to have the entire result set in memory?
> >    >> >>>
> >    >> >>> phil.
> >    >> >>>
> >    >> >>> [ Muliawan Sjarif ] wrote:
> >    >> >>>
> >    >> >>>
> >    >> >>>> If I need the entire resultset in the memory what would be
> >    >> >>>> the best approach? It seems that
> >    >> >>>> broker.getCollectionByQuery(q) stuck with huge records.
> >    >> >>>>
> >    >> >>>>
> >    >> >>>> On Tue, 12 Oct 2004 16:09:11 -0400, WHIRLYCOTT
> >    >> >>>> <[EMAIL PROTECTED]>
> >    >> >>>
> >    >> >>> wrote:
> >    >> >>>
> >    >> >>>>> You probably are doing something like this:
> >    >> >>>>>
> >    >> >>>>> Collection c = broker.getCollectionByQuery(q);
> >    >> >>>>>
> >    >> >>>>> ... and ought to be doing something like this:
> >    >> >>>>>
> >    >> >>>>> Iterator i = broker.getIteratorByQuery(q);
> >    >> >>>>>
> >    >> >>>>> Unless you need the entire result set in memory, this
> >    >> >>>>> should be your preferred approach.  Just iterate through
> >    >> >>>>> the results and do what you need to do to each of them.
> >    >> >>>>>
> >    >> >>>>> phil.
> >    >> >>>>>
> >    >> >>>>> [ Muliawan Sjarif ] wrote:
> >    >> >>>>>
> >    >> >>>>>
> >    >> >>>>>
> >    >> >>>>>> Hi,
> >    >> >>>>>>
> >    >> >>>>>> I was doing a quick test for OJB particularly using
> >    >> >>>>>> PersistenceBroker on one table that consists of 352544
> >    >> >>>>>> records. No matter how many
> >    >> >>>
> >    >> >>> times
> >    >> >>>
> >    >> >>>>>> I tried, in the end all I got was the browser not
> >    >> >>>>>> responding (no result displayed on the page) and tomcat
> >    >> >>>>>> throwed
> >    >> >>>
> >    >> >>> java.lang.OutOfMemory
> >    >> >>>
> >    >> >>>>>> exception. For this test, dynamic proxy was utilized.
> >    >> >>>>>>
> >    >> >>>>>> Pertaining to this problem, I wonder if anyone has
> >    >> >>>>>> encountered
> >    >> >>>
> >    >> >>> similar
> >    >> >>>
> >    >> >>>>>> problem. Or is there somewhere in the OJB's properties
> >    >> >>>>>> that need to
> >    >> >>>
> >    >> >>> be
> >    >> >>>
> >    >> >>>>>> tweaked?
> >    >> >>>>>>
> >    >> >>>>>> Many thanks.
> >    >> >>>>>>
> >    >> >>>>>> Regards, Muliawan
> >    >> >>>>>
> >    >> >>>>> -- Whirlycott Philip Jacob [EMAIL PROTECTED]
> >    >> >>>>> http://www.whirlycott.com/phil/
> >    >> >>>>>
> >    >> >>>>> ---------------------------------------------------------------------
> >    >> >>>>> To unsubscribe, e-mail:
> >    >> >>>>> [EMAIL PROTECTED] For additional
> >    >> >>>>> commands, e-mail: [EMAIL PROTECTED]
> >    >> >>>>>
> >    >> >>>>>
> >    >> >>>>
> >    >> >>>>
> >    >> >>>>
> >    >> >>> -- Whirlycott Philip Jacob [EMAIL PROTECTED]
> >    >> >>> http://www.whirlycott.com/phil/
> >    >> >>>
> >    >> >>> ---------------------------------------------------------------------
> >    >> >>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >    >> >>> For additional commands, e-mail:
> >    >> >>> [EMAIL PROTECTED]
> >    >> >>>
> >    >> >>>
> >    >> >>>
> >    >> >>>
> >    >> >>> ---------------------------------------------------------------------
> >    >> >>> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >    >> >>> For additional commands, e-mail:
> >    >> >>> [EMAIL PROTECTED]
> >    >> >>>
> >    >> >>>
> >    >> >>
> >    >> >>
> >    >> >>
> >    >>
> >    phil> -- Whirlycott Philip Jacob [EMAIL PROTECTED]
> >    phil> http://www.whirlycott.com/phil/
> >    >>
> >    phil> ---------------------------------------------------------------------
> >    phil> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >    phil> For additional commands, e-mail: [EMAIL PROTECTED]
> >    >>
> >    phil> --
> >    >>
> >    >>
> >    >> ---------------------------------------------------------------------
> >    >> To unsubscribe, e-mail: [EMAIL PROTECTED] For
> >    >> additional commands, e-mail: [EMAIL PROTECTED]
> >    >>
> >
> >    phil> --
> >    phil>                                    Whirlycott Philip Jacob
> >    phil>                                    [EMAIL PROTECTED]
> >    phil>                                    http://www.whirlycott.com/phil/
> >
> >    phil> ---------------------------------------------------------------------
> >    phil> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >    phil> For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
> 
> 
> --
> "It is your attitude, and not your aptitude, that determines your altitude"
> 


-- 
"It is your attitude, and not your aptitude, that determines your altitude"

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to