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