I am really just interested in the architecture, it's no so much an issue
with any version of ofbiz. (In fact I am working on a system based on
ofbiz, it would be better to replace it with pure ofbiz, but that is not my
decision to make). I hope you will still be willing to discuss your
implementation regardless of that fact.

Yes org.ofbiz.geronimo.GeronimoTransactionFactory
calls ConnectionFactoryLoader.getInstance().getConnection(helperInfo,
datasourceInfo.getInlineJdbc());
which is implemented
through 
org.ofbiz.entity.connection.DBCPConnectionFactory.getConnection(GenericHelperInfo,
Element) which uses a
ConcurrentHashMap to store a connection pool per tenant datasource and it
seems to work very well, the correct pool is provided to the appropriate
tenant threads.

This is an intermittent issue when testing with 50-100 tenants,
transactions across tenants seem to collide occasionally. At least that
seems to be the case, I have stepped through the code in a debugger.

It seem to happen in SqlProcessor finalize method, the gc calls finalize
and when the connection is closed (returned to the pool) it calls commit
first and then rolls back because a transaction is in progress as a result
the connection is leaked and doesn't return to the pool. This is clearly
seen on a massive scale in jprofiler on the jdbc probe page.

Is it a limitation of the architecture? Is it possible to provide a
TransactionManger per tenant in ThreadLocal or would that not work?

Or am I missing something here? I realise it's a complex issue, but I am
trying to stay as close to ofbiz as I can I hope one day we can replace the
framework with a pure ofbiz implementation. I'd rather not make a change
like this which diverges from ofbiz architecture. How would you solve this
issue?


On Wed, Jul 20, 2016 at 1:17 PM, Jacopo Cappellato <
[email protected]> wrote:

> Hi Justin,
>
> your understanding of the class implementation is correct and there may be
> a chance that some code may need to be improved, but I am not sure as I
> could only give a cursory look at the code.
> By the way, I see that the code in GeronimoTransactionManager calls a
> "tenant-aware" method in DBCPConnectionFactory and this should provide the
> correct connection to every thread.
>
> Could you please elaborate more on your concern? If you could share a
> usage/failure scenario to recreate the issue it would be great too.
>
> Thanks,
>
> Jacopo
>
> On Wed, Jul 20, 2016 at 6:38 AM, Justin Robinson <
> [email protected]> wrote:
>
> > I am trying to understand the database connection pooling in ofbiz 14,
> > which uses dbcp2.
> >
> > In the class org.ofbiz.entity.connection.DBCPConnectionFactory there is a
> > static ConcurrentHashMap which provides a ManagedDataSource for each
> > tenant.
> >
> > But when it comes to obtaining a transaction manager reference, it looks
> > like there is one global instance for all tenants.
> >
> > getTransactionManager in org.ofbiz.geronimo.GeronimoTransactionFactory
> > returns the static reference to a single GeronimoTransactionManager.
> >
> > In multi tenant testing overlapping from different tenants seem like they
> > interact with eachother.
> >
> > Can you explain how the implementation is supposed to work in with multi
> > tenancy ?
> >
>

Reply via email to