Re: Leak-free context - requesting feedback

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Tue Nov 21 2006 - 22:53:00 EST

  • Next message: Andrus Adamchik: "Re: [JIRA] Updated: (CAY-316) stream support for blob/clob"

    I just checked in this code. Nice side effect is that now we can
    deprecate ObjectStore.startTrackingNewObjects() and
    ObjectStore.unregisterNewObjects() - obscure methods used for manual
    memory management.

    Since this is a big paradigm shift in Cayenne in general, I
    appreciate feedback. Also for those who want the old behavior, I
    added an extra constructor to the ObjectStore that takes a map, so
    that current default could be overridden (e.g. via DataContextFactory).

    The change currently only covers only traditional DataContext. I
    figured that with ROP, since there is no local cache of object
    snapshots, deallocating prematurely may result in extra remote calls
    for relationships... Still somehow I feel that adding this change as
    a default strategy across the board is cleaner than leaving things as
    is.

    Andrus

    On Nov 14, 2006, at 11:46 AM, Tore Halset wrote:

    > Hello.
    >
    > +1 (move to cayenne and make it default behaviour)
    >
    > This is a realy good idea. It should improve situations with a
    > context bound to a session as well. We need to have a pretty long
    > session timeout so this improvement should be significant.
    >
    > I see that you have created a pluggable QueryCache. As discussed
    > before we should also create a DataRowStore equivalent with a
    > pluggable caching solution. I think you mentioned that this store
    > should cache DataObjects instead of DataRows, so I do not know
    > where to start :)
    >
    > - Tore.
    >
    > On Nov 14, 2006, at 16:02, Andrus Adamchik wrote:
    >
    >> As we all know, DataContext doesn't clean up unused registered
    >> objects on an assumption that the entire DataContext has a finite
    >> lifespan and will be garbage-collected eventually.
    >>
    >> In my session-less web application I am using an app-scoped read-
    >> only DC shared by all requests. Sure enough it leaks memory, given
    >> a big enough database. In the past we solved this problem by
    >> periodically replacing a shared instance of DC with a new one.
    >> Since this approach intrerfered with the caching mechanism and
    >> generally seemed dirty, the other day I implemented a self-
    >> cleaning ObjectStore based on commons-collections ReferenceMap:
    >>
    >> class LeakFreeObjectStore extends ObjectStore {
    >>
    >> public LeakFreeObjectStore(DataRowStore dataRowCache) {
    >> super(dataRowCache);
    >> objectMap = new ReferenceMap(AbstractReferenceMap.HARD,
    >> AbstractReferenceMap.WEAK);
    >> }
    >> }
    >>
    >> Note that I couldn't use LRUMap, as we can't unregister objects
    >> that are referenced by other application objects, so instead I
    >> used weak references to cleanup otherwise unreferenced instances.
    >> Been watching this in production for a day and it works perfectly.
    >>
    >> Now the question is whether we want this behavior as a default (or
    >> as an option) for the DataContext? In other words should I move
    >> this fix to Cayenne? (I will have to modify it to create hard
    >> references to the dirty objects as we can't deallocate those even
    >> if they are not referenced in the app).
    >>
    >> I'd say yes, but I was wondering if premature garbage collection
    >> of registered objects is bad for any reason? Thoughts?
    >>
    >> Andrus
    >>
    >>
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Tue Nov 21 2006 - 22:53:41 EST