2 same queries => different results? [message #387364] |
Sat, 18 April 2009 10:50 |
andiqo Messages: 32 Registered: July 2009 |
Member |
|
|
Hello,
I try to invoke the same query twice and I didn't get same results?!
What could be wrong (see source code and output below)?
I tried to disable Query Cache but still different results...
I am using EclipseLink 2.0.0 Milestone Build.
Thanks a lot for your help.
andiqo
//-- source code
Query query1 = em.createQuery("SELECT o FROM Node o WHERE o.name = :name");
query1.setParameter("name", "w1");
List<?> results1 = query1.getResultList();
System.out.println("** results1.size is: " + results1.size());
Query query2 = em.createQuery("SELECT o FROM Node o WHERE o.name = :name");
query2.setParameter("name", "w1");
List<?> results2 = query2.getResultList();
System.out.println("** results2.size is: " + results2.size());
//-- output
[EL Fine]: 2009-04-18
12:42:02.684--ServerSession(485367518)--Connection(148503708 9)--Thread(Thread[main,5,main])--SELECT
ID, VERSION, NODETYPE_ID FROM NODE WHERE (NAME = w1)
** results1.size is: 1
[EL Fine]: 2009-04-18
12:42:04.329--ServerSession(485367518)--Connection(20566293) --Thread(Thread[main,5,main])--SELECT
ID, VERSION, NODETYPE_ID FROM NODE WHERE (NAME = w1)
** results2.size is: 0
|
|
|
|
|
Re: 2 same queries => different results? [message #387381 is a reply to message #387371] |
Sat, 25 April 2009 09:04 |
andiqo Messages: 32 Registered: July 2009 |
Member |
|
|
Hello,
I could investigate a little more this morning. Below is my test class and
my properties. I am using PostgreSQL 8.3.7 on x86_64-pc-linux-gnu with
jdbc driver: 8.3-604.jdbc4.
In fact, I could have my test pass changing my setupClass() method as
follow:
@BeforeClass
public static void setupClass() throws Exception {
em = emf.createEntityManager();
Assert.assertTrue(em.isOpen());
Connection conn = JpaSpiActions4Test.getInstance().getConnection(em);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATAB LE_READ);
conn.setAutoCommit(false);
createSchema(em);
populate();
}
=> failure
@BeforeClass
public static void setupClass() throws Exception {
em = emf.createEntityManager();
Assert.assertTrue(em.isOpen());
Connection conn = JpaSpiActions4Test.getInstance().getConnection(em);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COM MITTED);
conn.setAutoCommit(false);
createSchema(em);
populate();
}
=> success!
@BeforeClass
public static void setupClass() throws Exception {
em = emf.createEntityManager();
Assert.assertTrue(em.isOpen());
Connection conn = JpaSpiActions4Test.getInstance().getConnection(em);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATAB LE_READ);
conn.setAutoCommit(false);
createSchema(em);
em.close();
emf.close();
emf = Persistence.createEntityManagerFactory("JenmoPU");
em = emf.createEntityManager();
Assert.assertTrue(em.isOpen());
populate();
}
=> success!
It still looks strange for me...
Thanks a lot for your help!
andiqo
// ======================================
public class TestDbEclipseLink {
protected static EntityManagerFactory emf =
Persistence.createEntityManagerFactory("JenmoPU");
private static EntityManager em;
protected static void createSchema(EntityManager em) throws
SQLException {
Connection conn = JpaSpiActions4Test.getInstance().getConnection(em);
boolean previous = conn.getAutoCommit();
conn.setAutoCommit(true);
IProcedure1<Connection> createSchema =
CreateSchemaAction.getAction();
createSchema.execute(conn);
conn.setAutoCommit(previous);
}
protected static void populateData(final IPopulator populator, boolean
closeEm)
throws DbUseCaseException {
DbUseCase dbUc = new DbUseCase() {
@Override
protected void reallyExecute(EntityManager em) throws
DbUseCaseException {
try {
// txBegin before call to reallyExecute in DbUseCase
populator.execute();
// txCommit after call to reallyExecute in DbUseCase
} catch (ProcedureException e) {
throw new DbUseCaseException(e);
}
}
};
dbUc.execute(populator.getEm(), closeEm);
}
protected static void runPopulator(IPopulator populator) throws
Exception {
if (populator != null) {
MyTimer timer = new MyTimer();
populateData(populator, false);
timer.end("End Populating data");
}
}
protected static void txBegin(EntityManager em) {
if (em.getTransaction().isActive() == true) {
em.getTransaction().commit();
}
em.getTransaction().begin();
}
protected static void txCommit(EntityManager em) {
if (em.getTransaction().isActive() == true) {
em.getTransaction().commit();
}
em.getTransaction().begin();
}
protected static void cleanUpTables(EntityManager em) {
txBegin(em);
// Should read table names from output.sql
em.createNativeQuery("delete from EDGE").executeUpdate();
em.createNativeQuery("delete from NODE").executeUpdate();
em.createNativeQuery("delete from NODEFIELD").executeUpdate();
em.createNativeQuery("delete from NODEPROPERTY").executeUpdate();
em.createNativeQuery("delete from NODEREVISION").executeUpdate();
em.createNativeQuery("delete from NODETYPE").executeUpdate();
em.createNativeQuery("delete from PROPERTY").executeUpdate();
em.createNativeQuery("delete from
PROPERTY_NODETYPE").executeUpdate();
em.createNativeQuery("delete from SPLITBLOB").executeUpdate();
em.createNativeQuery("delete from SPLITBLOBPART").executeUpdate();
txCommit(em);
}
protected static void populate() throws Exception {
runPopulator(new IPopulator() {
@Override
public EntityManager getEm() {
return em;
}
@Override
public boolean execute() throws ProcedureException {
NodeType type = NodeType.newInstance("node-type");
Node root = Node.newRoot(type, "root");
em.persist(root);
return true;
}
});
}
@BeforeClass
public static void setupClass() throws Exception {
em = emf.createEntityManager();
Assert.assertTrue(em.isOpen());
Connection conn = JpaSpiActions4Test.getInstance().getConnection(em);
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATAB LE_READ);
conn.setAutoCommit(false);
createSchema(em);
populate();
}
@AfterClass
public static void teardownClass() {
if (em != null) {
txCommit(em);
em.close();
em = null;
}
}
@Before
public void setupMethod() {
txBegin(em);
}
@After
public void teardownMethod() {
txCommit(em);
}
@Test
public void testJpql() throws Exception {
Query query1 = em.createQuery("SELECT o FROM Node o WHERE o.name =
:name");
query1.setParameter("name", "root");
List<?> results1 = query1.getResultList();
int s1 = results1.size();
Query query2 = em.createQuery("SELECT o FROM Node o WHERE o.name =
:name");
query2.setParameter("name", "root");
List<?> results2 = query2.getResultList();
int s2 = results2.size();
Assert.assertEquals(s1, s2);
System.out.println("** results1.size is: " + results1.size());
System.out.println("** results2.size is: " + results2.size());
}
}
<property name="javax.persistence.jdbc.url"
value="jdbc:postgresql://localhost:5432/jenmo?compatible=7.1" />
<property name="javax.persistence.jdbc.driver"
value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.user" value="postgres" />
<property name="javax.persistence.jdbc.password" value="dbadmin" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.jdbc.batch-writing.size" value="1000" />
<property name="eclipselink.jdbc.cache-statements" value="true" />
<property name="eclipselink.jdbc.cache-statements.size"value="1000" />
<property name="eclipselink.target-database"
value="org.jenmo.core.domain.MyPostgreSQLPlatform" />
<property name="eclipselink.target-server" value="None" />
<property name="eclipselink.cache.shared.default" value="true" />
<property name="eclipselink.query-results-cache" value="true" />
<property name="eclipselink.query-results-cache.expiry" value="100000" />
<property name="eclipselink.query-results-cache.size" value="1000" />
|
|
|
|
Powered by
FUDForum. Page generated in 0.04441 seconds