Thanks for the responses!  I think I'm going to try
the "pre-iterate" approach as it will allow me to
handle exceptions in the controller tier instead of in
the presentation tier.

I think that sort of flexibility would be greatly
appreciated by people trying to tune their
castor-based applications.

Speaking of tuning...it would obviously be faster to
execute one SQL statement that brought back the parent
and all the children when a relationship field is NOT
lazily loaded instead of issuing what appears to be
one query for the parent and n queries for the
children.  Has anyone raised this topic as a potential
change already?  It seems like a significant
performance issue if you have any number of child
objects in a relationship at all...

--- Werner Guttmann <[EMAIL PROTECTED]> wrote:
> 
> Jon,
> 
> just picking up on one of your questions below, as
> Patrick has provided answers to everything else.
> 
> Werner
> 
> On Thu, 6 May 2004 17:22:43 +0100, Patrick van Kann
> wrote:
> 
> >Hello Jon,
> >
> >Unfortunately, lazy loading can only be used in
> short transactions.
> >
> >The underlying RelationCollection holds a
> relationship to the transaction context in which the
> parent object is loaded, which it calls upon to load
> 
> objects when iterator.next is called. If you have
> closed the transaction that loaded the parent
> object, it can't lazily load when you call
> iterator.next().
> >
> >One strategy is to "pre-iterate" in the
> transaction, which could work in a situation where
> you are providing "pages" of results from a database
> query. In 
> other words, iterate the first 10 items in the lazy
> loaded collection before closing the transaction and
> returning the object.
> >
> >Otherwise, you need to load the object from within
> your JSP page/presentation tier. If it is jsp, you
> could use the castor taglibrary to do this quite
> easily:
> >
> >http://castor-taglib.sourceforge.ne
> >
> >Hope this helps,
> >
> >Patrick
> >
> >
> >-----Original Message-----
> >From: Jon Wilmoth [mailto:[EMAIL PROTECTED]
> >Sent: Thu 5/6/2004 4:59 PM
> >To: [EMAIL PROTECTED]
> >Subject: [castor-dev] [JDO] lazy loaded collections
> > 
> >
> >After turning on logging on my JDBC driver, I
> noticed
> >that a seperate query statement was issued for each
> >child object in a parent child relationship (i.e.
> >ProductGroup --> Product). 
> >
> >Query   "SELECT
>
>AA_PRODUCT_GROUP.PROD_GROUP_ID,AA_PRODUCT.PRODUCT_ID,AA_PRODUCT_GROUP.CATEGORY
> >FROM AA_PRODUCT_GROUP LEFT OUTER JOIN AA_PRODUCT ON
>
>AA_PRODUCT_GROUP.PROD_GROUP_ID=AA_PRODUCT.PRODUCT_GROUP_ID"
> > execution time: 0       result set fetch time:  0
> >
> >Followed by...
> >
> >Query   "SELECT
> >AA_PRODUCT.NAME,AA_PRODUCT.PRODUCT_GROUP_ID FROM
> >AA_PRODUCT WHERE AA_PRODUCT.PRODUCT_ID=1"     
> >execution time: 70      result set fetch time:
> >0
> >Query   "SELECT
> >AA_PRODUCT.NAME,AA_PRODUCT.PRODUCT_GROUP_ID FROM
> >AA_PRODUCT WHERE AA_PRODUCT.PRODUCT_ID=2"     
> >execution time: 0       result set fetch time:
> >0
> >Query   "SELECT
> >AA_PRODUCT.NAME,AA_PRODUCT.PRODUCT_GROUP_ID FROM
> >AA_PRODUCT WHERE AA_PRODUCT.PRODUCT_ID=3"     
> >execution time: 70      result set fetch time:
> >0
> >Query   "SELECT
> >AA_PRODUCT.NAME,AA_PRODUCT.PRODUCT_GROUP_ID FROM
> >AA_PRODUCT WHERE AA_PRODUCT.PRODUCT_ID=4"     
> >execution time: 10      result set fetch time:
> >0
> >
> >In some instances I would want to load the children
> >(i.e. a ProductGroup detail page) and other cases I
> >wouldn't want to spend time loading the children
> (i.e.
> >a ProductGroup search results page that didn't
> display
> >any Product info).  So...my first question, is
> there a
> >way to specify lazy loading of a field at runtime?
> No, there isn't. Imho, it would be an interesting
> exercise to add such a feature, but I personally
> believe that the calling semantics of such a feature
> 
> would be quite hard to specify.
> 
> >In an effort to optimize, I turned the field "lazy"
> >attribute value from false to true in the
> ProductGroup
> >mapping, which resulted in just the first sql query
> >being issued...so far so good.  However, after
> closing
> >the query via a database.close() call, and
> returning
> >the ProductGroup object to the presentation tier, I
> >got the following exception when trying to access
> the
> >ProductGroup's Products:
> >
> >java.lang.RuntimeException: Transaction is closed!
> >
>
>org.exolab.castor.persist.RelationCollection$IteratorImp.lazyLoad(RelationCollection.java:282)
> >
>
>org.exolab.castor.persist.RelationCollection$IteratorImp.next(RelationCollection.java:266)
> >
> >Which leads me to my second question: How are lazy
> >loaded collections properly used in a web app
> >environment?  Am I supposed to leave the database
> >object open until the presentation tier is done
> with
> >the query.  Am I supposed to loop through the
> search
> >results (effectively loading them) before returning
> >them to the presentation tier?
> >
> >Thanks,
> >Jon
> >
> >
> >
>
>-----------------------------------------------------------
> 
> >If you wish to unsubscribe from this mailing, send
> mail to
> >[EMAIL PROTECTED] with a subject of:
> >        unsubscribe castor-dev
> >
> >
> >
> >
> 
> 
> 
>
-----------------------------------------------------------
> 
> If you wish to unsubscribe from this mailing, send
> mail to
> [EMAIL PROTECTED] with a subject of:
>         unsubscribe castor-dev



----------------------------------------------------------- 
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
        unsubscribe castor-dev

Reply via email to