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: users@openjpa.apache.org 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