Just use the Delegator factory.

Adrian Crum
Sandglass Software
www.sandglass-software.com

On 8/26/2014 2:43 PM, Scott Gray wrote:
Hi Adrian,

I'll probably have plenty of questions, but the first that comes to mind is: 
how would you use a delegator outside of a transaction with this approach?

Thanks
Scott

On 25/08/2014, at 10:51 am, Adrian Crum <adrian.c...@sandglass-software.com> 
wrote:

One persistent problem with the current Entity Engine implementation is the use 
of ThreadLocal variables in the Delegator and Transactions. Their use makes it 
difficult (and sometimes impossible) to fix Entity Engine bugs. They also make 
it impossible to multi-thread a Delegator instance.

Here is what I have had percolating in my head the last few months:

Transaction tx = TransactionFactory.newTransaction();
Delegator delegator = tx.getDelegator("default");
// Do stuff with delegator
Transaction nestedTx = TransactionFactory.newTransaction();
Delegator nestedDelegator = nestedTx.getDelegator("default");
// Do stuff with nestedDelegator
nestedTx.commit();
tx.commit();

A Delegator instance always references the transaction it is running in.

The advantage to this approach is we gain the ability to hand off Delegator 
instances to other threads. Other threads can even commit/rollback a 
transaction:

Transaction tx = delegator.getTransaction();
tx.commit();

After a commit, the Delegator instance is discarded. Any attempt to use it 
after a commit throws an exception (the same is true with the Transaction 
instance).

Another problem is Delegator localization - which also uses ThreadLocal 
variables. We can localize Delegator instances like this:

Transaction tx = TransactionFactory.newTransaction();
Delegator delegator = tx.getDelegator("default", locale);

Finally, the current implementation has a caching problem: 
https://issues.apache.org/jira/browse/OFBIZ-5534

With the new design, the Delegator instance, Transaction instance, and entity 
cache are tightly coupled - so that problem is easy to solve.

What do you think?

--
Adrian Crum
Sandglass Software
www.sandglass-software.com

Reply via email to