Re: Dr. Miguel 'Optimistic Locking' Arroz [was Re: WebObjects stress Testing tool?]
Re: Dr. Miguel 'Optimistic Locking' Arroz [was Re: WebObjects stress Testing tool?]
- Subject: Re: Dr. Miguel 'Optimistic Locking' Arroz [was Re: WebObjects stress Testing tool?]
- From: Jon Nolan <email@hidden>
- Date: Mon, 28 Feb 2011 08:28:21 -0700
- Organization: Loch Garman
Hi Kieran,
I have a multi-threaded app and I'm starting to run into deadlock issues on EC locking/unlocking (OSC really). After a weekend of digging and researching I think your solution is the answer.
Question #1: Is this the final, dust-settled version?
Question #2: Do you always use a new EOObjectStore in your threads? It seems your implementation depends upon it. If so, what's your philosophy on how many you create and how long they live? I have tens of thousands of threads running per instance per day (only a few at a time) and something tells me creating a new OS for each is a bad idea.
Thanks,
Jon
On 12/3/09 1:31 PM, Kieran Kelleher wrote:
OK, this is the final concurrent utility code to provide manual locking ec's in a app with safeLocking on. And just for fun and Ricardo's enjoyment of anonymous classes ;-), the factory is an anonymous static class and its _create method returns anonymous ERXEC's with the two methods over-riden as per Anjo's suggestion.
/**
*AnonymousERXECfactorythatcreatesmanuallockingec'sinanappwheresafeLockingisonbydefault
*/
private static ERXEC.Factory manualLockingEditingContextFactory = new ERXEC.DefaultFactory() {
@Override
protected EOEditingContext _createEditingContext(EOObjectStore parent) {
return new ERXEC(parent == null ? EOEditingContext.defaultParentObjectStore() : parent) {
@Override
public boolean useAutoLock() {return false;}
@Override
public boolean coalesceAutoLocks() {return false;}
};
}
};
/**
*@returnaregularERXECwithnoauto-lockingfeatures
*/
public static EOEditingContext newManualLockingEditingContext() {
returnmanualLockingEditingContextFactory._newEditingContext();
}
/**
*Idonotwantautolockinginnon-requestthreads
*
*@paramparent
*@returnanERXECwithsafeLockingpropertiesturnedOFF.
*/
public static EOEditingContext newManualLockingEditingContext(EOObjectStore parent) {
returnmanualLockingEditingContextFactory._newEditingContext(parent);
}
On Dec 3, 2009, at 2:54 PM, Mike Schrag wrote:
i think we're talking two different things ... if you have an empty superclass constructor and you don't declare any constructors, then yes, there is an implicit constructor created in your subclass that calls super (as well, if you DO declare a constructor and there is an empty super constructor, implicitly a super() is added to the top of your constructor). in this case, because the anonymous subclass is declared as new ERXEC(os), it's actually calling the ERXEC(ObjectStore) constructor (which I PRESUME java secretly added into your subclass with a super(os) call -- this is a little different than a normal class). However, Kieran's specifically talking about the ERXEC.newEditingContext() factory method, which you're bypassing here by explicitly subclassing ERXEC and instantiating the class directly.
ms
On Dec 3, 2009, at 2:45 PM, Ricardo J. Parada wrote:
Don't subclasses have an implicit super() to invoke the super class constructor?
On Dec 3, 2009, at 2:38 PM, Kieran Kelleher wrote:
True, but then I would be bypassing the EC factory, which just seems dirty, but yes, this very good suggestion is an elegant way to do it for sure.
On Dec 3, 2009, at 2:16 PM, Anjo Krank wrote:
PS. And even the above is not perfect protection against an autolock if a thread gets cpu execution delay between construction statement and the ec.setCoalesceAutoLocks(false) statement. After setting safelocking props to false, I should really check if the ec was autolocked and unlock it before returning .... or even have an ERXEC constructor that takes a safeLocking boolean param, but that would be two more undesired constructors ....... so probably making isLockedInThread public (or accessible using reflection) should do the trick.
In that case, you'd be better with
return new ERXEC(os) {
public boolean useAutoLock() {return false;}
public boolean coalesceAutoLocks() {return false;}
};
Cheers, Anjo
_______________________________________________
_______________________________________________
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
_______________________________________________
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