[ 
https://issues.apache.org/jira/browse/OPENJPA-347?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Kevin Sutter updated OPENJPA-347:
---------------------------------

    Attachment: OPENJPA-347.patch

Proposed patch and testcase update for this problem.

> Performance Issue with Lazy Loaded Foreign Keys
> -----------------------------------------------
>
>                 Key: OPENJPA-347
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-347
>             Project: OpenJPA
>          Issue Type: Bug
>          Components: kernel
>    Affects Versions: 1.0.0
>            Reporter: Kevin Sutter
>            Assignee: Kevin Sutter
>             Fix For: 1.0.1, 1.1.0
>
>         Attachments: OPENJPA-347.patch
>
>
> We're hitting a performance regression with the latest OpenJPA code when 
> specifying LAZY fetch type with OneToOne and ManyToOne relationships.  It 
> seems that we're loading more than just the foreign key (normal LAZY 
> behavior) and processing them like an EAGER fetch type.  Here's some example 
> SQL codes:
> Previous version of OpenJPA generates the following:
> SELECT t0.PROFILE_USERID, t0.BALANCE, t0.CREATIONDATE, t0.LASTLOGIN, 
> t0.LOGINCOUNT, t0.LOGOUTCOUNT, t0.OPENBALANCE FROM ACCOUNTEJB t0 WHERE 
> t0.ACCOUNTID = ?  optimize for 1 row
> With latest OpenJPA, we see the following being generated:
> SELECT t1.USERID, t2.ACCOUNTID, t2.BALANCE, t2.CREATIONDATE, t2.LASTLOGIN, 
> t2.LOGINCOUNT, t2.LOGOUTCOUNT, t2.OPENBALANCE, t1.ADDRESS, t1.CREDITCARD, 
> t1.EMAIL, t1.FULLNAME, t1.PASSWD, t0.BA
> LANCE, t0.CREATIONDATE, t0.LASTLOGIN, t0.LOGINCOUNT, t0.LOGOUTCOUNT, 
> t0.OPENBALANCE FROM ACCOUNTEJB t0 LEFT OUTER JOIN ACCOUNTPROFILEEJB t1 ON 
> t0.PROFILE_USERID = t1.USERID LEFT OUTER JOIN ACCOUNTEJB t2 ON t1.USERID = 
> t2.PROFI
> LE_USERID WHERE t0.ACCOUNTID = ?  optimize for 1 row
> It looks like the regression is due to the introduction of the fix I provided 
> for OPENJPA-281 where the @Basic types were not eagerly being loaded by 
> default.  In this test scenario, the field types used for the foreign keys 
> were Serializable.  Thus, the test in isInDefaultFetchGroup() would 
> incorrectly put the whole relationship in the default fetch group (making it 
> eager).
> As I was debugging this problem, I learned that OpenJPA loads the foreign key 
> fields eagerly regardless of the setting of the LAZY fetch type.  Our 
> customers would most likely expect this behavior and it doesn't cost anything 
> (or next to nothing) to load these additional fields.  It just becomes a 
> problem when we traverse the relationship when it's marked LAZY...
> It looks like the problem can be easily resolved by just moving my check for 
> Serializable in isInDefaultFetchGroup() to just the JavaTypes.OBJECT type and 
> not the JavaTypes.PC type.  This makes more sense since the intent of the 
> @Basic eager change was for basic simple attribute types, not relationships.  
> And, foreign key fields would fall into the JavaTypes.PC (Persistence 
> Capable) type.
> We're testing this theory with the performance run right now.  So far, it 
> looks good.  And, I have modified the TestEagerBidiSQL test to test for this 
> condition (the current versions of BidiChild and BidiParent were not 
> Serializable and, thus, we didn't hit this problem when I did the fix for 
> OPENJPA-281).
> If anybody has any further thoughts on this problem, please post.  Thanks.
> Kevin

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to