You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2015/05/11 06:42:41 UTC

[6/8] cayenne git commit: CAY-2009 Non-blocking connection pool

CAY-2009 Non-blocking connection pool

fixing a problem with manager working on exhausted pool


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/4f8c1142
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/4f8c1142
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/4f8c1142

Branch: refs/heads/master
Commit: 4f8c1142a9134681d589333b714aab206ca2e05f
Parents: 741ad3b
Author: aadamchik <aa...@apache.org>
Authored: Sun May 10 19:20:51 2015 -0400
Committer: aadamchik <aa...@apache.org>
Committed: Sun May 10 19:20:51 2015 -0400

----------------------------------------------------------------------
 .../datasource/ManagedPoolingDataSource.java    |  8 ++++---
 .../cayenne/datasource/PoolingDataSource.java   |  4 +++-
 .../datasource/PoolingDataSourceTest.java       | 22 ++++++++++++++++++++
 3 files changed, 30 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/4f8c1142/cayenne-server/src/main/java/org/apache/cayenne/datasource/ManagedPoolingDataSource.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/ManagedPoolingDataSource.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/ManagedPoolingDataSource.java
index 182ad75..80c3db8 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/ManagedPoolingDataSource.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/ManagedPoolingDataSource.java
@@ -40,11 +40,13 @@ public class ManagedPoolingDataSource implements DataSource, ScopeEventListener
 	private DataSource dataSource;
 
 	public ManagedPoolingDataSource(PoolingDataSource dataSource) {
+		// wake every 2 minutes...
+		this(dataSource, 120000);
+	}
 
+	public ManagedPoolingDataSource(PoolingDataSource dataSource, long managerWakeTime) {
 		this.dataSource = dataSource;
-
-		// wake every 2 minutes...
-		this.dataSourceManager = new PoolingDataSourceManager(dataSource, 120000);
+		this.dataSourceManager = new PoolingDataSourceManager(dataSource, managerWakeTime);
 
 		dataSourceManager.start();
 	}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4f8c1142/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSource.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSource.java b/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSource.java
index f760ec1..9d3b5cf 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSource.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/datasource/PoolingDataSource.java
@@ -169,7 +169,9 @@ public class PoolingDataSource implements DataSource {
 
 			try {
 				PoolAwareConnection c = createUnchecked();
-				reclaim(c);
+				if (c != null) {
+					reclaim(c);
+				}
 			} catch (SQLException e) {
 				LOGGER.info("Error creating new connection when managing connection pool, ignoring", e);
 			}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/4f8c1142/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSourceTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSourceTest.java b/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSourceTest.java
index 25b7e7e..5cbfa4c 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSourceTest.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSourceTest.java
@@ -126,6 +126,28 @@ public class PoolingDataSourceTest {
 	}
 
 	@Test
+	public void testManagePool_Empty() throws SQLException {
+
+		int max = 5;
+
+		params.setMinConnections(1);
+		params.setMaxConnections(max);
+		PoolingDataSource ds = new PoolingDataSource(nonPooling, params);
+
+		// opening and closing 'max' connections should fill the pool to the
+		// top...
+		Connection[] open = new Connection[max];
+		for (int i = 0; i < max; i++) {
+			open[i] = ds.getConnection();
+		}
+
+		// all connections are in use, so managePool should do nothing
+		assertEquals(max, ds.poolSize());
+		ds.managePool();
+		assertEquals(max, ds.poolSize());
+	}
+
+	@Test
 	public void testValidateUnchecked() {
 
 		final PoolAwareConnection[] connections = validConnections(4);