Hi Michael and everyone else involved! I greatly appreciate the efforts put into this and I'm glad to report that simple testing at home, with the same laptop I use during the project, it seems that i get the desired performance when enabling ConnectionRetainMode = always. I will of course continue testing when i get back to the office. Just to clarify, I'm not sure this is the end of all my worries ;)
Note. I am running this without connection pooling as this was not a default setting of OpenJPA. The project specifies that all frameworks are run with minimal setting changes and "as vanilla as possible". This does however not explain why i get much better results on my home laptop. Granted it is faster and has more memory, but I got the same results as Pinaki which would indicate (to me atleast) that the result on my home laptop is as it's "supposed" to be. Now, a question. Since this ConnectionRetainMode is not on always by default. Does this suggest that OpenJPA is supposed/(required?) to be run with a connection pool addon? I mean, if this was the case, why is it not included by default? I hope this made any sense, I'm having a hard time formulating coherent replies as this is my second language and I'm quite new to all of this (OpenJPA/JPA etc..). Thanks again! Shubbis Michael Dick wrote: > > Hi all, > > As Paul pointed out privately I didn't indicate which versions of OpenJPA > I > was using. I've been testing with 1.2.0, 1.2.1 and 2.0.0-SNAPSHOT > primarily. > I also ran with 1.3.0-SNAPSHOT, and 1.0.3 for comparison - there wasn't > much > difference though so reduced the scope to 1.2 and trunk. > > The testcase uses a single EntityManager instance to issue a batch of > findBy > operations. In OpenJPA each findBy (or any query for that matter) obtains > a > connection from the connection pool and returns it after getting the > results. So we're spending a lot of time moving the connection to and from > the pool (some cleanup is done along the way). > > Fortunately this behavior can be configured with the > openjpa.ConnectionRetainMode property. Setting it to "always" causes the > EntityManager to hold on to a single connection until the EntityManager > closes. Obviously this setting introduces the possibility of exhausting > the > connection pool if num_entitymanagers > max_connections, but for this > benchmark it's safe to try. > > Setting ConnectionRetainMode gave OpenJPA equivalent times on my laptop at > 100 - 100,000 iterations. In addition I removed the > openjpa.jdbc.SynchronizeMappings property from the example (it's > extraneous > once the tables are created anyway).Another option I enabled that made > some > difference was preparedStatementCaching in dbcp. I'm assuming EclipseLink > has some pstmt caching as well, but that could be faulty - in which case > I'll disable it in dbcp. > > Here's the entire set of properties I'm using : > properties.put("openjpa.Log", "DefaultLevel=FATAL"); > properties.put("openjpa.RuntimeUnenhancedClasses", "unsupported"); > properties.put("openjpa.ConnectionRetainMode", "always"); > properties.put("openjpa.ConnectionDriverName", > "org.apache.commons.dbcp.BasicDataSource"); > > properties.put("openjpa.ConnectionProperties", String.format( > "DriverClassName=%s, Url=%s, username=%s, password=%s," > + " MaxActive=%s, MaxIdle=%s, MinIdle=%s, MaxWait=%s" > + ", poolPreparedStatements=true" > , JDBC_DRIVER, JDBC_URL, JDBC_USER, > JDBC_PASSWORD, MAX_CON, MIN_CON, MIN_CON, "1000")); > > EntityManagerFactory factory = > Persistence.createEntityManagerFactory("OpenJPAPU", > properties); > > MIN_CON = 1, MAX_CON=10. > > Shubbis, could you try running something similar and see if you get the > same > results? > > -mike > > On Fri, Mar 20, 2009 at 8:46 AM, Michael Dick > <michael.d.d...@gmail.com>wrote: > >> Hi, I took a quick run with the source code from the RAR Shubbis attached >> earlier (thanks BTW). >> >> The SQL we execute for this findBy is SELECT t0.warehouseName FROM >> Warehouse t0 WHERE t0.warehouseNr = ?. Pretty basic, and I doubt >> EclipseLink >> is doing better (certainly not 3x) based solely on the SQL. >> >> So I started digging deeper and on my laptop (not to be confused with any >> sort of "real" benchmark) there's a sweet spot around 100 iterations. >> Under >> 100 OpenJPA is faster. Between 100 and 125 they're comparable, and over >> 125 >> iterations EclipseLink starts pulling ahead. >> >> Environment : >> * Entities were enhanced by the PCEnhancer tool prior to running the >> tests. >> >> * Connection pooling is enabled for EclipseLink and OpenJPA with roughly >> the same settings. EclipseLink's pool and commons-dbcp weren't an easy >> 1:1 >> match, so I might have some investigation to do there. >> * MySQL Connector for Java v 5.1.7. >> * MySQL database running locally, Version: 5.0.67-0ubuntu6 >> * Tests executed in Eclipse, YMMV outside of Eclipse. >> * Sun JDK 5 java full version "1.5.0_15-b04" >> >> I have done a lot of hacking about with the sample application but I >> don't >> think I've violated the intent of the exercise. I'll upload the app to a >> jira shortly. >> >> The relevant code is in my pastebin at these links : >> persistence.xml : http://miked.pastebin.com/m490814b7 >> test01.java : http://miked.pastebin.com/m7d3df62f >> WarehouseDAO.java : http://miked.pastebin.com/m49ab9a0e >> >> I highlighted the changed lines in WarehouseDAO, but missed it on the >> others (too many lines to highlight accurately. >> >> I'm still looking, but thought this was worth sharing in case someone >> else >> sees something I've missed. >> >> -mike >> >> >> >> On Thu, Mar 19, 2009 at 10:53 AM, Paul Copeland >> <t...@jotobjects.com>wrote: >> >>> >>> At one point in this thread it was mentioned that the benchmark ran much >>> faster on a home computer than on an office computer and the reason for >>> the >>> difference was not obvious. Was that difference explained yet? >>> >>> What version of OpenJPA is the test using? >>> >>> - Paul >>> >>> >>> On 3/19/2009 7:44 AM, Kevin Sutter wrote: >>> >>>> Shubbis and Nitish, >>>> Thanks for your efforts. So, to clarify -- all implementations are >>>> using >>>> similar configurations (ie. connection pooling, caching, enhancement, >>>> etc)? >>>> But, the OpenJPA performance is still 3 times slower than the >>>> competitors? >>>> In all of the scenarios? Or, just with this ManyToMany scenario? I >>>> would >>>> expect some overhead as compared to iBatis and/or straight JDBC, but >>>> OpenJPA >>>> should be competitive (and beat) the Hibernates and EclipseLinks... >>>> Very >>>> frustrating. When we do our comparisons with the industry benchmarks >>>> (Trade >>>> and SpecJApp), OpenJPA is extremely competitive. >>>> >>>> I have not closely examined your benchmark project, so I don't know how >>>> it >>>> compares to Trade and/or SpecJApp work loads. Any thoughts on this >>>> topic? >>>> >>>> One other thought... Just to prove that the enhancement processing is >>>> being >>>> done and you're not falling into the sub-classing support, could you >>>> run >>>> with the following property? This will cause your application to >>>> error-off >>>> if your Entities are not byte-code enhanced. We will not fall into the >>>> sub-classing support which greatly affects the performance. >>>> >>>> <property name="openjpa.RuntimeUnenhancedClasses" >>>> value="warn"/> >>>> >>>> It really seems that you are trying to do a fair comparison, and I >>>> greatly >>>> appreciate your efforts. The last time one of these comparisons was >>>> posted, >>>> the benchmark code and process was flawed. So, I am pleased to see the >>>> efforts associated with this exercise. >>>> >>>> Our performance lead is out having a baby, so we haven't been able to >>>> dig >>>> into your benchmark to the extent that we would like. If we can verify >>>> that >>>> the enhancement processing is happening, that would be good input. >>>> Thanks >>>> for your patience. What kind of timeframe are you under for posting >>>> this >>>> benchmark? >>>> >>>> Thanks, >>>> Kevin >>>> >>>> On Thu, Mar 19, 2009 at 9:05 AM, Shubbis <marius.jo...@broadpark.no> >>>> wrote: >>>> >>>> >>>> >>>>> Since we decided to go with vanilla installations of alle the >>>>> frameworks >>>>> we >>>>> have not added the connection pool feature to OpenJPA, until now. >>>>> >>>>> The results are sadly not that great. Yes, it's faster and it doesn't >>>>> run >>>>> out of connections like before, BUT it's still 3, yes, -three- times >>>>> slower >>>>> than Hibernate, EclipseLink, iBatis and regular JDBC when persisting >>>>> entities with many relations. >>>>> >>>>> Clearly this is not the kind of results I was hoping for and I'm quite >>>>> perplexed as to what to do. >>>>> >>>>> Shubbis >>>>> >>>>> >>>>> Nitish Kumar wrote: >>>>> >>>>> >>>>>> Hi subbis, >>>>>> If I let the iteration loop over 5000, I get that exception, It >>>>>> seems (I am not sure) openjpa is creating a new connection and after >>>>>> a >>>>>> while mysql runs out of connection. I tried the same code and >>>>>> iteration >>>>>> loop with a connection pool and it works fine. That should get you >>>>>> moving as of now, till someone from Open JPA team looks into the >>>>>> issue. >>>>>> >>>>>> Thanks and Regards, >>>>>> Nitish Kumar >>>>>> >>>>>> >>>>>> >>>>> -- >>>>> View this message in context: >>>>> >>>>> http://n2.nabble.com/Slow-performance-with-OpenJPA-when-selecting-from-a-ManyToMany-relation.-tp2466994p2503084.html >>>>> Sent from the OpenJPA Users mailing list archive at Nabble.com. >>>>> >>>>> >>>>> >>>>> >>>> >>>> >>>> >>> >>> >> > > -- View this message in context: http://n2.nabble.com/Slow-performance-with-OpenJPA-when-selecting-from-a-ManyToMany-relation.-tp2466994p2516988.html Sent from the OpenJPA Users mailing list archive at Nabble.com.