Hi Shubbis, On Wed, Mar 25, 2009 at 9:51 AM, Shubbis <marius.jo...@broadpark.no> wrote:
> > Hi Michael, > > Sorry for the delay, but we have been very busy with the project and other > mandatory school projects. > Please don't mistake the delay for a lack of interest or enthusiasm. > > > Is the separate download the deciding factor or is it the experimentation > > required to get the pool configured "right"? Including commons-dbcp in > our > > binary distribution is easy to fix. If it would help in bake-offs like > this > > I think we'd have no trouble getting the required votes for a change. > > Our project's guidelines specify that each framework has to be run with > default functionality (or as close to as possible). For this specific > project, with our guidelines, having dbcp included in the binary download > would certainly allow it to be included. > > As you noted, this particular test doesn't benefit much from the pooling > mechanism, but we are running quite a few other tests, so it would be > interesting to include as much as possible. > I'll open a JIRA to include commons dbcp in the binary distribution. It shouldn't increase the footprint too much. As of right now though, it would seem that the procedure of opening new > connections on every query was the culprit, and that ConnectionRetainMode > has was the solution. > > I would like to ask though, if you could think of any reason a case like > this would take much longer (5-10 sec) than say, EclipseLink to complete? > > Ex: > Inserting a DeliveryCompany, with OneToOne relation to ContactInfo that has > a ManyToOne to an Address that has an ManyToOne to an AreaCode that has a > ManyToOne to a Country that has a ManyToOne to a Region. > > Now I realize that this is quite abstract, but I hope you get my point. > Nothing's jumping out at me. Might be an eager/lazy loading issue. Have you specified any non-default loading properties in the entities, or are they vanilla relationships? > > Shubbis > > > Hi Shubbis, > > Glad to help. Some comments inline. > > On Sun, Mar 22, 2009 at 8:39 AM, Shubbis <marius.jo...@broadpark.no> > wrote: > > > > > 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. > > > I'm not sure why you're getting different results. Your initial results > roughly matched mine so I went with them as a baseline. Maybe my laptop > and > your work system are equally performance challenged :-). > > 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 wouldn't say a connection pool is required any more than a L2 cache is > required. It really depends on your use case. As you can tell when you run > with RetainMode and no pool, adding a pool doesn't always help and it can > lead to other interesting problems. Paul mentioned some in an earlier > email. > In addition OpenJPA is often used with a JEE Application Server, which > typically provides its own connection pool. Having two levels of pooling > can > lead to some interesting problems. > > I suspect these are some of the reasons why OpenJPA was originally > distributed without an integrated connection pool (and you don't have to go > far to get commons-dbcp so why reinvent the wheel). > > This specific test really benefits from having a single connection to the > database. There's only one thread using the DB, and it's just doing reads. > As long as the use case doesn't change you won't see much benefit from a > connection pool (you only need one connection anyway), or a L2 cache (the > EM > has cached everything for you). Try setting the connection pool size to 1 > for EclipseLink and OpenJPA and you might be surprised at the results. > > When you start writing data and have multiple EMs involved then your > options > become more intersting. Then you'll see benefits with a connection pool / > L2 > cache, etc. > > 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..). > > > > You're doing better than I would do in my second language, I'm sure. > > -mike > > > > 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. > > > > > > > > -- > View this message in context: > http://n2.nabble.com/Slow-performance-with-OpenJPA-when-selecting-from-a-ManyToMany-relation.-tp2466994p2532837.html > Sent from the OpenJPA Users mailing list archive at Nabble.com. > >