RE: Entries still appearing in the DataObject after deleting them inthe database

From: Fredrik Liden (flide..ranslate.com)
Date: Fri Feb 18 2005 - 14:30:44 EST

  • Next message: Mike Kienenberger: "Re: Entries still appearing in the DataObject after deleting them inthe database"

    Woah, I think I'll try not to go outside of Cayenne. That's a cool
    solution though.
    Did you try the optimistic locking and found it to be to slow? is there
    any risk of dead-locks?

    /Fredrik

    -----Original Message-----
    From: Mike Kienenberger [mailto:mkienen..laska.net]
    Sent: Friday, February 18, 2005 7:59 AM
    To: cayenne-use..bjectstyle.org
    Cc: cayenne-use..bjectstyle.org
    Subject: Re: Entries still appearing in the DataObject after deleting
    them inthe database

    Fredrik Liden <flide..ranslate.com> wrote:
    > At one time there are two items in an array of one dataObject. Then
    > going straight to the database I removed one item. Then when I reload
    > the page again I still see two items.

    Are you talking about removing the item externally to Cayenne? Or are
    you talking about using deleteObject() and still having the object
    show up in a to-many relationship?

    > I'm guessing the context is maintaining the state of the object and
    > because the context is stored in the session it's not being updated.
    > Is there any way to refresh a context to be aware of updates outside
    > of the framework? Or is this frowned upon? :)

    If you're talking about external updates, there's at least three
    different
    options:

    a) ignore the changes until they become important -- use optimistic
    locking
    to determine when you're trying to modify an externally-changed object.

    b) Change your external processes to use a cayenne-based notifier that
    sends
    update events.

    http://www.objectstyle.org/cayenne/userguide/design/events.html
    http://www.objectstyle.org/cayenne/modelerguide/configure-
    deployment/configure-cache.html

    c) set up a LAST_EXTERNAL_UPDATE table with a timestamp LAST_UPDATED
    field.
     Update the table after you externally change the data. Have your
    Cayenne
    app check this table periodically to see if LAST_UPDATED is newer than
    the
    last time you saw it. If so, update whatever you think changed.

    I'm currently using c) right now, but it's been tricky. I check for
    external updates in my web-based application at the start of every
    request.
     If it's changed, I invalidate all objects in my session DataContext,
    forcing them to reload. I have to use Level 1 caching because I don't
    want
    to invalidate objects actively being used in other sessions -- it'd be
    bad
    if an object someone was updating suddenly got invalidated and this is
    also
    why I only check for external updates at the start of a request.

    However, I want to have Level 2 caching so that an update in one session

    also updates the other sessions. What I did was set everything to use
    level 1 caching, but I set up a LocalEventBridge (LEB) and register one
    to
    every DataContext. This LEB listens for SnapshotChanged events and
    rebroadcasts them to other contexts. It still confuses me why this
    works
    -- I'm still not sure why this is different from Level 2 caching as I
    sit
    here and describe it. I guess I need to write some unit tests to
    gurantee
    that this all works the way I expect it to. Note that if you're trying
    to
    do something like this, Cayenne 1.1 has a bug in invalidation
    notification.
    Rather than setting the corresponding object in another DataContext as
    Hollow, forcing it to reload, it sets it as transient instead and
    removes it
    from the other context. This can cause some odd errors as objects
    suddenly
    appear to be "deleted." There's a patch in CAY-256 for 1.1RC1 as well
    as a
    fix installed in cvs.



    This archive was generated by hypermail 2.0.0 : Fri Feb 18 2005 - 14:30:27 EST