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 <[EMAIL PROTECTED]> 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 >
