Does this test pass on trunk? This sounds pretty familiar to a change[1] that I put into trunk.
[1] https://issues.apache.org/jira/browse/OPENJPA-2285 On Mon, May 26, 2014 at 9:11 AM, LYALIKOV, Oleg (Oleg) < [email protected]> wrote: > Forgot to update project archive to successfully run in OpenJPA 2.0.0 - > you need to not only change openjpa version in pom file but also add > property > <property name="openjpa.RemoteCommitProvider" value="sjvm"/> > in persistence.xml file (and also use "-XX:-UseSplitVerifier" as project > configured to be compiled by jdk 7) > > Thanks, > Oleg > > From: LYALIKOV, Oleg (Oleg) > Sent: Monday, May 26, 2014 5:56 PM > To: [email protected] > Subject: Data cache does not work in OpenJPA 2.2.2 > > Hello, > > I have a simple project with several entities and several relations (a > little more complex than trivial) and when I execute query "SELECT obj FROM > MyEntity obj" several times OpenJPA still executes SQL queries on database > to retrieve some data. > > Some details: here are entities (you can find full descriptions in the > attached project): > Person 1->* DocumentBase > Document 1->* Link1 > Document 1->* Link2 > and Document entity inherits from DocumentBase entity. All relations are > eager OneToMany. > > I create one Person with one Document which also has one Link1 and one > Link2 objects. Then I execute query "SELECT DISTINCT obj FROM Person obj" > twice and still OpenJPA executes SQL queries for the second time to > retrieve Document/Link1/Link2 data. It makes 2 SQL queries. If I use > following setting (which I primarily interested in): > <property name="openjpa.jdbc.SubclassFetchMode" value="none"/> > then these queries are: > > SELECT t0.docName, t1.DOCUMENT_ID, t2.id > FROM Document t0 LEFT OUTER JOIN Document_Link1 t1 ON t0.id = > t1.DOCUMENT_ID > LEFT OUTER JOIN Link1 t2 ON t1.LINK1_ID = t2.id > WHERE t0.id = ? > ORDER BY t1.DOCUMENT_ID ASC > [params=(String) 51] > > and > > SELECT t1.id > FROM Document_Link2 t0 INNER JOIN Link2 t1 ON t0.LINK2_ID = t1.id > WHERE t0.DOCUMENT_ID = ? > [params=(String) 51] > > if I use default value for "openjpa.jdbc.SubclassFetchMode" property then > anyway 2 queries are executed: > > SELECT t1.id > FROM Document_Link1 t0 INNER JOIN Link1 t1 ON t0.LINK1_ID = t1.id > WHERE t0.DOCUMENT_ID = ? > [params=(String) 51] > > and > > SELECT t1.id > FROM Document_Link2 t0 INNER JOIN Link2 t1 ON t0.LINK2_ID = t1.id > WHERE t0.DOCUMENT_ID = ? > [params=(String) 51] > > If there are a lot of such objects and a lot of such relations then > application just spends all its time in database. It is serious performance > impact... > > There is junit test in the attached project which fails in OpenJPA 2.2.2 > and it passes in OpenJPA 2.0.0 so it looks like a regression. > > After some analysis it seems that the change was in > DataCacheStoreManager::load method. In the OpenJPA 2.0.0 the method > cacheStateManager is executed which properly put fully loaded objects in > cache while in OpenJPA 2.2.2 it firstly check CacheStoreMode, the value is > "USE", the objects are "alreadyCached" (they are actually in cache but only > partially loaded) and so OpenJPA does not update cache and so only > partially loaded objects are in cache and so OpenJPA always executes SQL > queries to complete these objects on every query. > > So should I post it as a bug in issue tracker? And also maybe you know > some workaround for this issue? > > Thanks, > Oleg > -- *Rick Curtis*
