diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index c3fd8b4..ec2eec6 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -20,6 +20,9 @@ public void insert(Object object) { metaData.insert(object); + + Long id = metaData.getId(object); + Cache.get().set((Class) object.getClass(), id, object); } public void update(Object object) { diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index c3fd8b4..ec2eec6 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -20,6 +20,9 @@ public void insert(Object object) { metaData.insert(object); + + Long id = metaData.getId(object); + Cache.get().set((Class) object.getClass(), id, object); } public void update(Object object) { diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 5265dc4..ca163a6 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -23,9 +23,10 @@ private ConnectionProvider connectionProvider = null; private List connectionPool = new LinkedList<>(); + private List usedPool = new LinkedList<>(); + private int minimumNumberOfConnections = 0; private int maximumNumberOfConnections = 20; - private int used = 0; public ConnectionPool() { } @@ -46,10 +47,10 @@ } public synchronized Connection getConnection() { - if (connectionPool.isEmpty() && used < maximumNumberOfConnections) { + if (connectionPool.isEmpty() && usedPool.size() < maximumNumberOfConnections) { ConnectionWrapper wrapper = new ConnectionWrapper(this, connectionProvider.getConnection()); - used++; + usedPool.add(wrapper); return wrapper; } @@ -62,14 +63,20 @@ } } - used++; - return connectionPool.remove(0); + ConnectionWrapper result = connectionPool.remove(0); + usedPool.add(result); + return result; } protected synchronized void returnConnection(ConnectionWrapper connection) { - used--; - connectionPool.add(connection); - notify(); + if (usedPool.contains(connection)) { + usedPool.remove(connection); + connectionPool.add(connection); + notify(); + } else { + // discard (clear was probably called) + connection.dispose(); + } } public boolean hasConnectionProvider() { @@ -77,6 +84,11 @@ } public synchronized void clear() { - connectionPool = new LinkedList<>(); + connectionPool.clear(); + usedPool.clear(); + } + + public ConnectionProvider getProvider() { + return connectionProvider; } } diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index c3fd8b4..ec2eec6 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -20,6 +20,9 @@ public void insert(Object object) { metaData.insert(object); + + Long id = metaData.getId(object); + Cache.get().set((Class) object.getClass(), id, object); } public void update(Object object) { diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 5265dc4..ca163a6 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -23,9 +23,10 @@ private ConnectionProvider connectionProvider = null; private List connectionPool = new LinkedList<>(); + private List usedPool = new LinkedList<>(); + private int minimumNumberOfConnections = 0; private int maximumNumberOfConnections = 20; - private int used = 0; public ConnectionPool() { } @@ -46,10 +47,10 @@ } public synchronized Connection getConnection() { - if (connectionPool.isEmpty() && used < maximumNumberOfConnections) { + if (connectionPool.isEmpty() && usedPool.size() < maximumNumberOfConnections) { ConnectionWrapper wrapper = new ConnectionWrapper(this, connectionProvider.getConnection()); - used++; + usedPool.add(wrapper); return wrapper; } @@ -62,14 +63,20 @@ } } - used++; - return connectionPool.remove(0); + ConnectionWrapper result = connectionPool.remove(0); + usedPool.add(result); + return result; } protected synchronized void returnConnection(ConnectionWrapper connection) { - used--; - connectionPool.add(connection); - notify(); + if (usedPool.contains(connection)) { + usedPool.remove(connection); + connectionPool.add(connection); + notify(); + } else { + // discard (clear was probably called) + connection.dispose(); + } } public boolean hasConnectionProvider() { @@ -77,6 +84,11 @@ } public synchronized void clear() { - connectionPool = new LinkedList<>(); + connectionPool.clear(); + usedPool.clear(); + } + + public ConnectionProvider getProvider() { + return connectionProvider; } } diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 0336df7..d90afc7 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -39,6 +39,8 @@ } } }); + + ConnectionPool.get().clear(); } @AfterClass @@ -61,10 +63,10 @@ Person p2 = Persister.find(Person.class, id); - Persister.rollback(); - Assert.assertNotNull(p2); Assert.assertEquals("Rien", p2.getName()); + + Persister.rollback(); } } diff --git a/src/nl/astraeus/database/ObjectPersister.java b/src/nl/astraeus/database/ObjectPersister.java index c3fd8b4..ec2eec6 100644 --- a/src/nl/astraeus/database/ObjectPersister.java +++ b/src/nl/astraeus/database/ObjectPersister.java @@ -20,6 +20,9 @@ public void insert(Object object) { metaData.insert(object); + + Long id = metaData.getId(object); + Cache.get().set((Class) object.getClass(), id, object); } public void update(Object object) { diff --git a/src/nl/astraeus/database/jdbc/ConnectionPool.java b/src/nl/astraeus/database/jdbc/ConnectionPool.java index 5265dc4..ca163a6 100644 --- a/src/nl/astraeus/database/jdbc/ConnectionPool.java +++ b/src/nl/astraeus/database/jdbc/ConnectionPool.java @@ -23,9 +23,10 @@ private ConnectionProvider connectionProvider = null; private List connectionPool = new LinkedList<>(); + private List usedPool = new LinkedList<>(); + private int minimumNumberOfConnections = 0; private int maximumNumberOfConnections = 20; - private int used = 0; public ConnectionPool() { } @@ -46,10 +47,10 @@ } public synchronized Connection getConnection() { - if (connectionPool.isEmpty() && used < maximumNumberOfConnections) { + if (connectionPool.isEmpty() && usedPool.size() < maximumNumberOfConnections) { ConnectionWrapper wrapper = new ConnectionWrapper(this, connectionProvider.getConnection()); - used++; + usedPool.add(wrapper); return wrapper; } @@ -62,14 +63,20 @@ } } - used++; - return connectionPool.remove(0); + ConnectionWrapper result = connectionPool.remove(0); + usedPool.add(result); + return result; } protected synchronized void returnConnection(ConnectionWrapper connection) { - used--; - connectionPool.add(connection); - notify(); + if (usedPool.contains(connection)) { + usedPool.remove(connection); + connectionPool.add(connection); + notify(); + } else { + // discard (clear was probably called) + connection.dispose(); + } } public boolean hasConnectionProvider() { @@ -77,6 +84,11 @@ } public synchronized void clear() { - connectionPool = new LinkedList<>(); + connectionPool.clear(); + usedPool.clear(); + } + + public ConnectionProvider getProvider() { + return connectionProvider; } } diff --git a/test/nl/astraeus/database/TestFind.java b/test/nl/astraeus/database/TestFind.java index 0336df7..d90afc7 100644 --- a/test/nl/astraeus/database/TestFind.java +++ b/test/nl/astraeus/database/TestFind.java @@ -39,6 +39,8 @@ } } }); + + ConnectionPool.get().clear(); } @AfterClass @@ -61,10 +63,10 @@ Person p2 = Persister.find(Person.class, id); - Persister.rollback(); - Assert.assertNotNull(p2); Assert.assertEquals("Rien", p2.getName()); + + Persister.rollback(); } } diff --git a/test/nl/astraeus/database/TestMissingReference.java b/test/nl/astraeus/database/TestMissingReference.java index d9c2632..ff57614 100644 --- a/test/nl/astraeus/database/TestMissingReference.java +++ b/test/nl/astraeus/database/TestMissingReference.java @@ -40,6 +40,8 @@ } } }); + + ConnectionPool.get().clear(); } @AfterClass