Hi David, yes, the thread-local vars are thread safe. However in order to assign them a synchronized block or method is needed. There is no way to avoid synchronized block if we want to create a transaction using a static method without any arguments or without making the caller to keep a return value in a local variable ( public void TransactionUtil.begin() ). The begin() method needs to create a thread-local var and associate it with the currently running thread.
A workaround could be to use something like : UserTransaction transaction = TransactionUtil.createNewTransaction(); //... execute code TransactionUtil.commit( transaction ); this way we don't need any thread-local vars. However this approach would require to make lots of fixes in the existing code and this can not happen quickly. We've got to think of something else. -- Deyan On Tue, 2010-06-01 at 03:16 -0600, David E Jones wrote: > To be clear, I wasn't recommending that we remove synchronized from the begin > method in OFBiz, just that they remove it temporarily and then redo their > performance tests to see if that really is the problem. > > You're absolutely right that more work will be necessary to localize the > synchronization to avoid bottlenecks on a larger block of code. > > BTW, the three sub-method calls you mentioned should all only deal with > thread-local variables... aren't those thread-safe to use? > > -David > > > On Jun 1, 2010, at 12:42 AM, Deyan Tsvetanov wrote: > > > I take my words back about the workaround. > > It's much more complicated. > > > > On Tue, 2010-06-01 at 09:23 +0300, Deyan Tsvetanov wrote: > >> Hi guys, > >> > >> removing synchronized from begin( int timeout) will cause issues. > >> The problematic code is the following: > >> (starting from line 180 in TransactionUtil.java - trunk ) > >> > >> // reset the transaction stamps, just in case... > >> > >> clearTransactionStamps(); > >> // initialize the start stamp > >> getTransactionStartStamp(); > >> // set the tx begin stack placeholder > >> setTransactionBeginStack(); > >> > >> So the synchronized begin() is a huge bottleneck and imho it can't be > >> solved without coding. Caching is not a solution. > >> I think the transaction timestamps and the transaction begin stack have > >> to be moved to the UserTransaction so they are not static anymore. > >> In general TransactionUtil needs some rework. > >> > >> Cheers, > >> Deyan > >> > >> On Mon, 2010-05-31 at 14:34 -0600, David E Jones wrote: > >>> The theory that Martin mentioned is interesting, and quite possible. Have > >>> you tried removing the synchronized keyword from the begin method to see > >>> if it helps? > >>> > >>> That would just be to test the theory, and if that does turn out to be > >>> the bottleneck then the sensitive parts of the method should be > >>> synchronized (or put into separate synchronized methods) instead of > >>> snycing the whole method. > >>> > >>> -David > >>> > >>> > >>> On May 31, 2010, at 2:24 PM, Karl Pitrich wrote: > >>> > >>>> Hi, > >>>> > >>>> I'm working with Martin on this project. > >>>> > >>>> We have commented the various cache options as described in the Wiki > >>>> (and mailing list), > >>>> EXPIRE TIME is 0 in all except for product.* when viewing > >>>> /webtools/control/FindUtilCache > >>>> > >>>> Logging is disabled, as are several components. > >>>> Also, we have disabled several content elements from the template, such > >>>> as recommendations or polls, etc. > >>>> > >>>> > >>>> Any help is appreciated, > >>>> Greetings, > >>>> > >>>> - Karl > >>>> > >>>> On 31.05.2010, at 22:07, Jacques Le Roux wrote: > >>>> > >>>>> 1st level of answer, did you set caches? > >>>>> https://cwiki.apache.org/confluence/display/OFBTECH/Apache+OFBiz+Technical+Production+Setup+Guide#ApacheOFBizTechnicalProductionSetupGuide-CacheSettings > >>>>> https://cwiki.apache.org/confluence/display/OFBADMIN/Scaling+and+Performance+Plan > >>>>> > >>>>> Jacques > >>>>> > >>>>> From: "Martin Kreidenweis" <martin.kreidenw...@tngtech.com> > >>>>>> Hi, > >>>>>> > >>>>>> we are currently evaluating Apache OFBiz for use in one of our > >>>>>> projects. > >>>>>> > >>>>>> We expect a high load on our application. So we did a test with jMeter > >>>>>> on the sample ecommerce application with 100 parallel sessions and in > >>>>>> average 400 msec (randomized) wait time between requests. > >>>>>> > >>>>>> During profiling we experienced that > >>>>>> org.ofbiz.entity.transaction.TransactionUtil.begin() is by far the > >>>>>> dominating method invoked and the application spends about 75% of total > >>>>>> time in this method. > >>>>>> This results in page load times over 10 seconds and growing. > >>>>>> > >>>>>> Many threads are blocked because the method is defined as static and > >>>>>> synchronized. > >>>>>> > >>>>>> We are using MySQL as a database backend in our test setup and > >>>>>> deactivated all informational logging (even server hit statistics), and > >>>>>> most of the sidebar widgets. > >>>>>> > >>>>>> Any suggestions/ideas are highly appreciated. > >>>>>> Thanks. > >>>>>> > >>>>>> Best regards, > >>>>>> Martin > >>> > >> > >> > > > > >