Re: localObject vs prefetches: would there be a benefit ?

From: Mike Kienenberger (mkienen..mail.com)
Date: Fri Nov 02 2007 - 09:23:35 EDT

  • Next message: Marcin Skladaniec: "Re: localObject vs prefetches: would there be a benefit ?"

    I am no expert in this subject, but the cost of doing I/O is always
    going to exceed the cost of in-system memory copies, probably by
    orders of magnitude. The only place where this might not be true is
    using an in-memory database such as an HSQLDB mem jdbc connection.

    So unless you're copying orders-of-magnitude more data than you'd be
    fetching, always copy.

    Remember too that a localObject only copies the object, not any of its
    relationships. And the other objects are only pulled in if you
    access them, which is even more fine-grained than prefetching.

    So my guess is that localObject is ALWAYS orders of magnitude faster.
    I suspect it'd be extremely difficult to define a situation where this
    was not the case.

    On 11/1/07, Marcin Skladaniec <marci..sh.com.au> wrote:
    > Hi
    >
    > We are improving the performance of our client application (ROP). Not
    > surprisingly we have found that adding prefetches did improve the
    > speed significantly.
    >
    > I have a question though about which is about efficiency of
    > localObject. We are fetching a list of objects (query with prefetches)
    > to a specific one non-editable context. If the object is to be edited
    > it has to be copied to another context which allows committing
    > changes. After the object is copied all the related object are
    > accessed, so the performance of the copying came to my mind.
    >
    > The test I have looks like this:
    >
    > CayenneContext context1;
    > CayenneContext context2;
    >
    > SelectQuery q = new SelectQuery(Painting.class);
    > q.addPrefetch(Painting.GALLERY_PROPERTY);
    > q.addPrefetch(Painting. GALLERY_PROPERTY + "." + Gallery.CITY_PROPERTY);
    > List l = context1.performQuery(q);
    > //now the context1 contain all the records I wanted it to contain
    >
    > Painting p1 = (Painting) l.get(0);
    > Painting p2 = (Painting) context2.localObject(p1.getObjectId(), null);
    >
    > //now the context2 contain only the single record I copied
    > p2.getGallery().getCity();
    > //now context2 contains the same objects as context1
    >
    > All is very quick, but my question is how it will scale when the
    > relationship would be to-many and there will be hundreds related
    > records.
    >
    > What do you think would be a threshold number of related objects which
    > have to be localised over which it would be worth doing a new,
    > specific select query for that single object (with prefetches). Would
    > there be advantage of doing that at all ?
    >
    > We are using cutting edge version of cayenne (I think we use build
    > about 2-3 weeks old).
    >
    > Marcin
    >



    This archive was generated by hypermail 2.0.0 : Fri Nov 02 2007 - 09:24:09 EDT