From d18629bcb4e381f655f64ca3f234393fbf5e557a Mon Sep 17 00:00:00 2001
From: Nikolaus Krismer <niko@krismer.de>
Date: Sat, 22 Feb 2014 21:21:50 +0100
Subject: [PATCH] reworked connection pooling (this should fix the failed
 tests) adding boneCP dependency

---
 build.gradle                                  |  1 +
 .../inf/isochrone/config/ConfigIsochrone.java |  7 ++-
 .../inf/isochrone/db/ConnectionFactory.java   | 57 ++++++++++---------
 .../it/unibz/inf/isochrone/db/Database.java   |  2 -
 src/main/resources/config.xml                 |  2 +
 .../inf/isochrone/network/ComparisonTest.java |  6 +-
 6 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/build.gradle b/build.gradle
index 418a6c46..759e3804 100644
--- a/build.gradle
+++ b/build.gradle
@@ -80,6 +80,7 @@ dependencies {
 	compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.3.0'
 	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.3.0'
 	compile group: 'com.google.code.findbugs', name: 'annotations', version: '2.0.3'
+	compile group: 'com.jolbox', name: 'bonecp', version: '0.8.0.RELEASE'
 	compile group: 'com.tngtech.java', name: 'config-builder', version: '1.1'
 	compile(group: 'org.postgis', name: 'postgis-jdbc', version:'1.3+') {
 		exclude(module: 'postgis-stubs')
diff --git a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
index 1d9c0b6a..977a9812 100644
--- a/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
+++ b/src/main/java/it/unibz/inf/isochrone/config/ConfigIsochrone.java
@@ -45,7 +45,7 @@ public final class ConfigIsochrone {
 	@PropertyValue("db.batchSize")
 	private Integer batchSize;
 
-	@DefaultValue(value = "true")
+	@DefaultValue(value = "false")
 	@PropertyValue("db.pooling")
 	private Boolean pooling;
 
@@ -137,7 +137,8 @@ public final class ConfigIsochrone {
 	}
 
 	public int getMaxConnections() {
-		// TODO: This is not used (mail to t.gummerer and j.gamper)
+		// TODO: This was not used (mail to t.gummerer and j.gamper)
+		// Usage was implemented by n.krismer using bonecp
 		return maxConnections;
 	}
 
@@ -153,7 +154,7 @@ public final class ConfigIsochrone {
 		LOGGER.debug(" - isPooling: " + pooling);
 
 		try {
-			factory = new ConnectionFactory(pooling);
+			factory = new ConnectionFactory(pooling, maxConnections);
 			factory.register(host, database, port, user, password);
 		} catch (final SQLException e) {
 			throw new RuntimeException("Unable to connect to the database: " + e);
diff --git a/src/main/java/it/unibz/inf/isochrone/db/ConnectionFactory.java b/src/main/java/it/unibz/inf/isochrone/db/ConnectionFactory.java
index 3e616456..9110e042 100644
--- a/src/main/java/it/unibz/inf/isochrone/db/ConnectionFactory.java
+++ b/src/main/java/it/unibz/inf/isochrone/db/ConnectionFactory.java
@@ -4,27 +4,30 @@ import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 
-import javax.sql.PooledConnection;
-
-import org.postgresql.ds.PGConnectionPoolDataSource;
+import com.jolbox.bonecp.BoneCP;
+import com.jolbox.bonecp.BoneCPConfig;
 
 /**
- * Used for connecting to the PostgreSQL server and get connections
- * from a connection pool if pooling is enabled.
- *
- * <p>The <code>ConnectionFactory</code> class</p>
- * <p>Copyright: 2006 - 2009 <a href="http://www.inf.unibz.it/dis">Dis Research Group</a></p>
- * <p> Domenikanerplatz -  Bozen, Italy.</p>
+ * Used for connecting to the database server and for getting connections
+ * from a connection pool (if pooling is enabled in the config file).
  *
- * @author Markus Innerebner
- * @version 2.2
+ * @author Nikolaus Krismer
+ * @version 3
  */
 public class ConnectionFactory {
-	private boolean pooling = false;
-	private PooledConnection connectionPool;
+	private static final int MIN_CONNECTIONS = 5;
 	private Connection connection;
+	private BoneCP connectionPool;
+	private final int maxConnections;
+	private final boolean pooling;
+
+	public ConnectionFactory() {
+		this.maxConnections = 1;
+		this.pooling = false;
+	}
 
-	public ConnectionFactory(final boolean pooling) {
+	public ConnectionFactory(final boolean pooling, final int maxConnections) {
+		this.maxConnections = maxConnections;
 		this.pooling = pooling;
 	}
 
@@ -38,18 +41,20 @@ public class ConnectionFactory {
 	 * @param passwd The password for the database
 	 */
 	public void register(final String serverName, final String database, final int port, final String user, final String passwd) throws SQLException, ClassNotFoundException {
+		final String url = "jdbc:postgresql://" + serverName + ":" + port + "/" + database + "?binaryTransfer=true";
+		Class.forName("org.postgresql.Driver"); // load the driver
+
 		if (pooling) {
-			final PGConnectionPoolDataSource pds = new PGConnectionPoolDataSource();
-			pds.setServerName(serverName);
-			pds.setDatabaseName(database);
-			pds.setPortNumber(port);
-			pds.setUser(user);
-			pds.setPassword(passwd);
-			connectionPool = pds.getPooledConnection();
+			final BoneCPConfig config = new BoneCPConfig();
+			config.setDefaultAutoCommit(false);
+			config.setUser(user);
+			config.setPassword(passwd);
+			config.setJdbcUrl(url);
+			config.setMinConnectionsPerPartition(Math.min(MIN_CONNECTIONS, maxConnections));
+			config.setMaxConnectionsPerPartition(maxConnections);
+			config.setPartitionCount(1);
+			connectionPool = new BoneCP(config);
 		} else {
-			Class.forName("org.postgresql.Driver"); // load the driver
-
-			final String url = "jdbc:postgresql://" + serverName + ":" + port + "/" + database + "?binaryTransfer=true";
 			connection = DriverManager.getConnection(url, user, passwd);
 			connection.setAutoCommit(false);
 		}
@@ -62,9 +67,7 @@ public class ConnectionFactory {
 	 */
 	public Connection getConnection() throws SQLException {
 		if (pooling) {
-			final Connection conn = connectionPool.getConnection();
-			conn.setAutoCommit(false);
-			return conn;
+			return connectionPool.getConnection();
 		}
 
 		return connection;
diff --git a/src/main/java/it/unibz/inf/isochrone/db/Database.java b/src/main/java/it/unibz/inf/isochrone/db/Database.java
index 88b20559..7a5821aa 100644
--- a/src/main/java/it/unibz/inf/isochrone/db/Database.java
+++ b/src/main/java/it/unibz/inf/isochrone/db/Database.java
@@ -36,8 +36,6 @@ import org.apache.commons.dbutils.DbUtils;
  * <br />
  * Domenikanerplatz - Bozen, Italy.
  * </p>
- * <p>
- * </p>
  *
  * @author Markus Innerebner
  * @version 2.2
diff --git a/src/main/resources/config.xml b/src/main/resources/config.xml
index 2b078443..aca5349f 100644
--- a/src/main/resources/config.xml
+++ b/src/main/resources/config.xml
@@ -3,6 +3,8 @@
 <properties>
 	<!-- Global database settings -->
 	<entry key="db.maxConnections">50</entry>
+	<entry key="db.pooling">false</entry>
+
 	<!-- Postgres database -->
 	<entry key="org.postgresql.servername">localhost</entry>
 	<entry key="org.postgresql.database">isochrone</entry>
diff --git a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
index 380e6380..fa6eca33 100644
--- a/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
+++ b/src/test/java/it/unibz/inf/isochrone/network/ComparisonTest.java
@@ -30,16 +30,12 @@ public class ComparisonTest {
 		final Query queryDijkstra = new Query(Direction.INCOMING, WALKING_SPEED, DURATION, TIME, false, Mode.MULTIMODAL);
 		queryDijkstra.setNodes(NODE_ID);
 		final Isochrone mDijkstra = new MDijkstra(config, queryDijkstra);
-		MemoryOutput outDijkstra = new MemoryOutput();
-		outDijkstra = mDijkstra.compute(outDijkstra);
 
 		final Query queryMinex = new Query(Direction.INCOMING, WALKING_SPEED, DURATION, TIME, true, Mode.MULTIMODAL);
 		queryMinex.setNodes(NODE_ID);
 		final Isochrone mineX = new MineX(config, queryMinex);
-		MemoryOutput outMineX = new MemoryOutput();
-		outMineX = mineX.compute(outMineX);
 
-		Assert.assertEquals(outDijkstra.getLinks(), outMineX.getLinks(), "Dijkstra != MineX");
+		Assert.assertEquals(mDijkstra.compute().getLinks(), mineX.compute().getLinks(), "Dijkstra != MineX");
 	}
 
 	@Test
-- 
GitLab