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