Re: Stale data in EC
Re: Stale data in EC
- Subject: Re: Stale data in EC
- From: Eric Stewart <email@hidden>
- Date: Fri, 2 Dec 2005 14:01:58 -0500
Chuck,
You are right on all accounts.
Here's a little broader understanding of the system. It's a content
finder, storage and retrieval system based on keywords. A client (a
client in general terms not Java client, be it browser or other
script) queries the system using a URL with the keyword in it (which
hits a direct action). The system then tries to reply with whatever
content it knows about that keyword.
If the system has never seen the keyword, it is then stored in a
"NewKeyword" table which is basically operating as a stack for finding
content for keywords it's not aware of. Once an hour another
application is fired off via cron and a direct action which then
starts popping keywords out of the new keyword table, finds content
for them via spidering and saves the keyword and data into the
permanent keyword store tables. Then the system will be able to
provide content for that particular keyword from that point on.
This system has over 4.5 million keywords and recieves on average 2
million request a day.
But as I said, some sort of race condition is happening. I can't
figure out how to only make sure a new keyword isn't entered into the
new keyword table more than once.
- Eric
On 12/2/05, Chuck Hill <email@hidden> wrote:
> Hi Eric,
>
> I am not sure that I am following this correctly, so some questions
> below.
>
>
> On Dec 2, 2005, at 8:26 AM, Eric Stewart wrote:
>
> > Hello everyone,
> >
> > I'm having a problem where it appears I'm getting stale data from the
> > editing context.
> >
> > I have a direct action that is inserting keywords into a database
> > table. The word itself (called "descriptor") is unique because I don't
> > want the same keyword in the system twice.
> >
> > When a direct action request comes in for information about that
> > keyword, I check to see if that keyword is already in the system. If
> > not I add it.
> >
> > Here is the code I use to check for that keyword.
> >
> > /**
> > * Determines whether a new keyword with the given descriptor is
> > present in the system.
> > */
> > public static boolean isPresentByDescriptor(EOEditingContext ec,
> > String descriptor) {
> > NSDictionary args = new NSDictionary(descriptor, "descriptor");
> > EOQualifier qual = EOQualifier.qualifierToMatchAllValues(args);
> > EOFetchSpecification fs = new EOFetchSpecification("NewKeyword",
> > qual, null);
> >
> > // Make sure we fetch fresh data
> > fs.setRefreshesRefetchedObjects(true);
> >
> > // Find the keyword matching value
> > NSArray keywords = ec.objectsWithFetchSpecification(fs);
> > if (keywords.count() == 0) {
> > // No match found
> > return false;
> > } else if (keywords.count() > 1) {
> > // More than one match found
> > if (NSLog.debugLoggingAllowedForLevel(NSLog.DebugLevelCritical)) {
> > NSLog.debug.appendln("Duplicate new keyword found matching: " +
> > descriptor);
> > }
> > return true;
> > } else {
> > // Match found return the keyword
> > return true;
> > }
> > }
> >
> > What is happening is I'm getting a lot of exceptions complaining that
> > a keyword being added to the system is not unique, hence I can only
> > guess that data from the EC is stale and is not reflecting newly
> > inserted keywords.
> >
> By exception do you mean the debug message above, a unique constraint
> violation on the database, or something else?
>
>
>
> > This direct action is running on an application that has around 20
> > instances running. So some how one of the other instances is inserting
> > a new keyword and the other instances continue to report it as not
> > being there.
> >
>
> You could have a race condition where two instances check the
> database for the same keyword, and see that it is not there. They
> they both insert it. The second one to commit will (attempt to)
> duplicate the value in the database. Is that what you are seeing?
> You can even see this on a single instance if you are dispatching
> requests concurrently.
>
>
> > Should I be using EditingContext.refaultAllObjects() or will this not
> > solve my problem. What I don't want to happen is for this to severely
> > degrade the performance of the application. I think I remember
> > EditingContext.invalidateAllObjects() causing a pretty poor
> > performance on high load applications, which this is. Is there some
> > other way to check whether the keyword is in the system or not before
> > it's added without incurring such a severe penalty?
> >
> I would not suggest any of those solutions. Are the instances
> actually changing the descriptor of NewKeywords, just only inserting
> new ones? If they are only inserting new ones, there should not be
> an issue with actual stale data the way you are fetching it. I
> suspect your problem may lie elsewhere.
>
>
> > Is there anyway to refault JUST the data in a certain table or of a
> > certain type of EO and not all the data in an EditingContext.
> >
> You can do it object by object, but again, that does not seem to be
> the problem (or I am misunderstanding your situation).
>
> Chuck
>
> --
> Coming in 2006 - an introduction to web applications using WebObjects
> and Xcode http://www.global-village.net/wointro
>
> Practical WebObjects - for developers who want to increase their
> overall knowledge of WebObjects or who are trying to solve specific
> problems. http://www.global-village.net/products/practical_webobjects
>
>
>
>
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden