Hmm... I'm using background threads in my apps to do some processing.  The 
thread creates is editing context for its own use.  Something like this:

            EOObjectStoreCoordinator parentObjectStore = new 
EOObjectStoreCoordinator();
            editingContext = ERXEC.newEditingContext(parentObjectStore);

I pass GIDs to this background thread.  But if I understand what you are 
saying, creating the editing context like this can still get me in trouble 
still.  

Ricardo




On Feb 17, 2010, at 3:23 PM, Kieran Kelleher wrote:

> Some tidbits that might help:
> 
> 1) Don't pass EOs between threads. Pass their EOGlobalIDs and use 
> ec.faultForGlobalID to rehydrate them in an ec in the thread that needs them. 
>  Use Wonder ERXEO<Something>Utilities.convertEOtoGID if desired.  (Something  
> = 'Access' or 'Control', I can never remember which)
> 
> 2) If you have autolocking on and if you are using ERXEC.newEditingContext, 
> you may get deadlocks. To continue to use autolocking in request threads and 
> to created guaranteed non-autolocking EC's in plain old background threads, 
> you can paste this into your own EO Utils class and just use the static 
> creation method:
> 
> 
>       /**
>        * Anonymous ERXEC factory that creates manual locking ec's in an app 
> where safeLocking is on by default
>        */
>       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;}
>                       };
>               }
>       };
> 
>       /**
>        * @return a regular ERXEC with no auto-locking features
>        */
>       public static EOEditingContext newManualLockingEditingContext() {
>               return manualLockingEditingContextFactory._newEditingContext();
>       }
>       
>       /**
>        * I do not want autolocking in non-request threads
>        * 
>        * @param parent
>        * @return an ERXEC with safeLocking properties turned OFF.
>        */
>       public static EOEditingContext 
> newManualLockingEditingContext(EOObjectStore parent) {
>               return 
> manualLockingEditingContextFactory._newEditingContext(parent);
>       }
> 
> 
> 
> 3) Depending on the intensity of the EOF activity, you may want to use a 
> different EOObjectStoreCoordinator than the default or a pool of them for 
> background threads so as not to interfere with request thread EOF performance.
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Feb 17, 2010, at 2:34 PM, Philippe Rabier wrote:
> 
>> Hi all,
>> 
>> I get an issue with a multi threaded application. To be easier to 
>> understand, my description is simpler than the reality but that's enough to 
>> see what's going on I guess.
>> 
>> I'm using:
>> WO 5.4.3
>> Snow Leopard/ java 6
>> Wonder (not the very last but not old)
>> I put the following properties:
>> er.extensions.ERXEC.traceOpenLocks=true
>> er.extensions.ERXEC.markOpenLocks=true
>> 
>> There 2 threads (not worker threads handled by WO) created by a 
>> frameworkPrincipal (in the wonder sense) with a classical run loop (while 
>> (true)....).
>> 
>> BigObject A running in thread A has an editingContext A (ecA) that fetches, 
>> for example, customers from entity Customer
>> 
>> BigObject B running in thread B has an editingContext B (ecB) that fetches 
>> objects, for example invoices from entity Invoice. Invoice has a to one 
>> relationship with Customer
>> 
>> BigObject A passes to BigObject B a list of customers. Suppose there is only 
>> one customer in the list.
>> 
>> Object B periodically fetches invoices, customer by customer, so it 
>> constructs a qualifier like invoice.customer.eq(aCustomer), then a 
>> fetchspec, ... Of course, there is some code like:
>> 
>> ecB.lock();
>> try
>>      invoices = ecB.objectsWithFetchSpecification(fetchSpecification);
>> catch
>> finally
>> ecB.unlock();
>> 
>> The log tells me that when ecB.objectsWithFetchSpecification is executed, 
>> ecA is locked. And it's locked forever. I wasn't sure to have to use a 
>> localInstance of customer because I use it only to create a qualifier. But I 
>> did the test and it's worth.
>> 
>> If I execute something like that before the construction of the qualifier:
>>  myCustomers = EOUtilities.localInstanceOfObject(ecB, customers);
>> 
>> ecA and ecB are locked automatically and never unlocked.
>> 
>> I found a solution, that's to lock/unlock both editingContexts but I'm 
>> unsatisfied because I don't understand why EOUtilities.localInstance locks 
>> ecA and ecB and doesn't unlock them. Naturally I would find the good way to 
>> use it.
>> 
>> Any idea what's going on? 
>> 
>> The stack trace when ecA is locked by BigObjectB:
>> 
>> Outstanding at @Thread[Thread-4,5,main]
>> java.lang.Exception: Locked
>>      at er.extensions.eof.ERXEC.traceLock(ERXEC.java:532)
>>      at er.extensions.eof.ERXEC.lock(ERXEC.java:502)
>>      at er.extensions.eof.ERXEC.autoLock(ERXEC.java:627)
>>      at er.extensions.eof.ERXEC.globalIDForObject(ERXEC.java:844)
>>      at 
>> com.webobjects.eoaccess.EODatabaseContext._globalIDForObject(EODatabaseContext.java:4644)
>>      at 
>> com.webobjects.eoaccess.EODatabaseContext.databaseOperationForObject(EODatabaseContext.java:4767)
>>      at 
>> com.webobjects.eoaccess.EODatabaseContext.valuesForKeys(EODatabaseContext.java:6535)
>>      at 
>> com.webobjects.eocontrol.EOObjectStoreCoordinator.valuesForKeys(EOObjectStoreCoordinator.java:326)
>>      at 
>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_KeyValueQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:439)
>>      at 
>> er.extensions.ERXExtensions$KeyValueQualifierSQLGenerationSupport.schemaBasedQualifierWithRootEntity(ERXExtensions.java:333)
>>      at 
>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>      at 
>> com.webobjects.eoaccess.EOQualifierSQLGeneration$_AndQualifierSupport.schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:530)
>>      at 
>> com.webobjects.eoaccess.EOQualifierSQLGeneration$Support._schemaBasedQualifierWithRootEntity(EOQualifierSQLGeneration.java:179)
>>      at 
>> com.webobjects.eoaccess.EODatabaseChannel.selectObjectsWithFetchSpecification(EODatabaseChannel.java:227)
>>      at 
>> com.webobjects.eoaccess.EODatabaseContext._objectsWithFetchSpecificationEditingContext(EODatabaseContext.java:3055)
>>      at 
>> com.webobjects.eoaccess.EODatabaseContext.objectsWithFetchSpecification(EODatabaseContext.java:3195)
>>      at 
>> com.webobjects.eocontrol.EOObjectStoreCoordinator.objectsWithFetchSpecification(EOObjectStoreCoordinator.java:488)
>>      at 
>> com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4069)
>>      at 
>> er.extensions.eof.ERXEC.objectsWithFetchSpecification(ERXEC.java:1211)
>>      at 
>> com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4444)
>>      at fr.sophiacom.ynp.push.BigObjectB.fetchesInvoice(BigObjectB.java:238)
>>      at fr.sophiacom.BigObjectB._run(BigObjectB.java:110)
>>      at er.extensions.concurrency.ERXRunnable.run(ERXRunnable.java:23)
>>      at java.lang.Thread.run(Thread.java:637)
>> 
>> Philippe
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
>> Help/Unsubscribe/Update your Subscription:
>> http://lists.apple.com/mailman/options/webobjects-dev/kieran_lists%40mac.com
>> 
>> This email sent to kieran_li...@mac.com
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/rparada%40mac.com
> 
> This email sent to rpar...@mac.com

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to