Hi Justin,

On Wed, Jul 20, 2016 at 12:37 PM, Justin Robinson <
[email protected]> wrote:

> 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.
>

Definitely!


>
> 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.
>

Hmmm... this is an interesting detail, there could be an issue in the
SqlProcessor class or maybe in the way that is used in your framework.

I will dig into this more and let you know if I find something interesting.

Jacopo


>
> 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