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