Re: Cayenne performance degrades over time

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Wed Jun 22 2005 - 16:32:47 EDT

  • Next message: Paul Cowan: "Re: Cayenne performance degrades over time"

    In general (also answering Holger's message) - I am all for smarter
    ObjectStore that covers a wider range of use scenarios. I am not ready to
    say which way is better or more generic - weak reference map or an LRU
    map. If you want to discuss this further, let's use cayenne-devel list.

    For now there is a number of options:

    1. Replace a DataContext every so often
    2. Use ObjectStore.startTrackingNewObjects()/unregisterNewObjects() - we
    don't advertise this API to often, but it works pretty well.
    3. Create an ObjectStore subclass along these lines:

    public class MyObjectStore extends ObjectStore {
      public MyObjectStore(DataRowStore cache) {
         super(cache);
         super.objectMap = some weak-reference or LRU map...
      }
    }

    DataDomain domain = Configuration.getSharedConfiguration().getDomain();
    ObjectStore os = new MyObjectStore(domain.getSharedSnapshotCache());
    DataContext context = new DataContext(domain, os);

    I haven't tried the last scenario, hope it won't break the faulting.

    Andrus

    > Yes, when I create a new DataContext every 1000 iterations, performance
    > does
    > not suffer any longer.
    >
    > However, it kinda seems like an inconvienent or kludgy fix. I wonder if
    > something could be done using weak references in the cache to solve this.
    > I
    > really liked using just one DataContext for this particular app. It does
    > a
    > lot of very short lived object creation.
    >
    >
    >
    >
    >
    >
    > --- Andrus Adamchik <andru..bjectstyle.org> wrote:
    >
    >> Paul,
    >>
    >> Cache settings have effect on the shared cache in a multiuser app. For a
    >> single session DataContext (or rather its ObjectStore) has no upper
    >> limit
    >> on the number of cached objects as it is designed to have a shorter life
    >> span.
    >>
    >> So a more realistic performance test would actually discard a
    >> DataContext
    >> and create a new one after a few operations (how many is "few" depends
    >> on
    >> your expected usage patterns).
    >>
    >> FYI: Here is the stack structure (default is level 2):
    >> http://objectstyle.org/cayenne/userguide/design/caching.html
    >>
    >> Andrus
    >>
    >>
    >> > Hi Andrus,
    >> >
    >> > I'm seeing behaviour in my app using Cayenne, where it runs slower and
    >> > slower
    >> > the longer the application runs without a restart. I suspect that it
    >> will
    >> > eventually run out of memory. Upon restart, performance starts out
    >> high
    >> > again.
    >> >
    >> > I wrote a very simple test application to rule out any of my custom
    >> code.
    >> > It
    >> > simply registers a new objects with the DataContext, sets a property,
    >> and
    >> > calls commitChanges. The test app prints out the elapsed time for
    >> every
    >> > 1000
    >> > iterations. The results are here:
    >> >
    >> > http://www.buzzsurf.com/java/cayenne/results.txt
    >> >
    >> > If you want to run the simple test application yourself, it's here:
    >> >
    >> > http://www.buzzsurf.com/java/cayenne/CayennePerfTest.zip
    >> >
    >> > As you can see, performance degrades linearly over time. It seems
    >> like
    >> > DataContext is caching a pointer to every object created, despite my
    >> cache
    >> > settings?? I've been playing with the "Max Number of Objects" setting
    >> in
    >> > the
    >> > Modeler, but different settings seem to have no effect.
    >> >
    >> > -Paul
    >> >
    >> >
    >> >
    >>
    >>
    >
    >



    This archive was generated by hypermail 2.0.0 : Wed Jun 22 2005 - 16:32:48 EDT