Re: Invalidating cache from external process?

From: Mike Kienenberger (mkienen..mail.com)
Date: Mon May 05 2008 - 13:06:36 EDT

  • Next message: Andrus Adamchik: "Re: Query.setRefreshingObjects(boolean)"

    The performance of this may not work for your specific situation, but
    my java web application allows for the possibility that some external
    process may update the database like this:

    I created a table: LAST_EXTERNAL_UPDATE with two fields:

    ID
    LAST_CHANGED

    Any external process changes the LAST_CHANGED timestamp field whenever
    something updates.

    I created an alternative class to
    org.apache.cayenne.conf.BasicServletConfiguration and changed
    "getDataContext()" to check for external updates before returning the
    dataContext.

            try
            {
                checkForExternalUpdates(dataContext, session);
            }
            catch (CayenneRuntimeException cayenneRuntimeException)
            {
                // If it failed, it probably failed during the database
    read, so ignore
                // REPORT ERROR code here
            }

        public static void checkForExternalUpdates(DataContext
    dataContext, String identityString, HttpSession session)
        {
            List lastExternalUpdateList = // FETCH YOUR
    LAST_EXTERNAL_UPDATE RECORD CODE HERE;

            boolean willInvalidate = false;

            if (1 != lastExternalUpdateList.size())
            {
                // database error -- zero or multiple LastExternalUpdate
    objects found
                // REPORT DATABASE ERROR CODE HERE
            }

            LastExternalUpdate latestExternalUpdateObject =
    (LastExternalUpdate)lastExternalUpdateList.get(0);

            if (null == latestExternalUpdateObject)
            {
                willInvalidate = false;
            }
            else
            {
                final Date lastSessionExternalUpdateDate =
    (Date)session.getAttribute("lastSessionExternalUpdateDate");

                Date latestChangedDate =
    latestExternalUpdateObject.getLastChanged();
                if (null == latestChangedDate)
                {
                    willInvalidate = false;
                }
                else if (null == lastSessionExternalUpdateDate)
                {
                    willInvalidate = true;
                }
                else
                {
                    if (lastSessionExternalUpdateDate.before(latestChangedDate))
                    {
                        willInvalidate = true;
                    }
                    else
                    {
                        willInvalidate = false;
                    }
                }

                session.setAttribute("lastSessionExternalUpdateDate",
    latestChangedDate);
            }

            if (willInvalidate)
            {
                dataContext.invalidateObjects(dataContext.getObjectStore().getObjects());
            }
        }

    Instead of a timer, this method checks every time you request the
    session datacontext. And it also invalidates everything if something
    changed. You can probably be far more selective than that.

    On 5/5/08, Andrus Adamchik <andru..bjectstyle.org> wrote:
    > for java-to-java invalidation I successfully used OSCache with JGroups. For
    > non-java apps that change the data there are a few options:
    >
    > 1. A private URL in a webapp that a script can access that would cause
    > cache invalidation
    > 2. A timer local to the app that checks a special table in DB that is
    > populated by the script on data changes.
    > 3. A timer running in a remote Java app that checks a DB table, and then
    > notifies another app with JGroups.
    > 4. etc.
    >
    > Andrus
    >
    >
    >
    > On May 5, 2008, at 11:21 AM, Andreas Pardeike wrote:
    >
    >
    > > Hi,
    > >
    > > I have an web application that serves html pages from a databases.
    > > That database is manipulated from a perl program that runs from
    > > within a proftpd ftp server. As a result, users can upload their
    > > html pages via ftp and the web application displays them.
    > >
    > > I want to cache the page queries in the web application but have
    > > not found a good way to invalidate a certain page in the cache once
    > > a user uploads a modified version of it.
    > >
    > > I use:
    > >
    > > - Tomcat on Linux
    > > - Tapestry 5
    > > - Cayenne 3
    > > - Mysql 5
    > > - Custom mod_exec perl script in proftpd
    > >
    > > What is the best approach here?
    > >
    > > /Andreas Pardeike
    > >
    > >
    >
    >



    This archive was generated by hypermail 2.0.0 : Mon May 05 2008 - 14:08:25 EDT