From 47d412dd0a815ed5eb315ee8e72fbc3be594a027 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 8 Apr 2022 15:00:48 +0100 Subject: [PATCH 1/2] Limit the size of the DB connection pool. --- .../briarproject/bramble/db/JdbcDatabase.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 0dfe41bd9..7bdb7f373 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -103,6 +103,11 @@ abstract class JdbcDatabase implements Database { // Package access for testing static final int CODE_SCHEMA_VERSION = 50; + /** + * The maximum number of idle connections to keep open. + */ + private static final int MAX_CONNECTION_POOL_SIZE = 10; + // Time period offsets for incoming transport keys private static final int OFFSET_PREV = -1; private static final int OFFSET_CURR = 0; @@ -364,7 +369,7 @@ abstract class JdbcDatabase implements Database { private final Condition connectionsChanged = connectionsLock.newCondition(); @GuardedBy("connectionsLock") - private final LinkedList connections = new LinkedList<>(); + private final LinkedList connectionPool = new LinkedList<>(); @GuardedBy("connectionsLock") private int openConnections = 0; @@ -572,7 +577,7 @@ abstract class JdbcDatabase implements Database { connectionsLock.lock(); try { if (closed) throw new DbClosedException(); - txn = connections.poll(); + txn = connectionPool.poll(); logConnectionCounts(); } finally { connectionsLock.unlock(); @@ -606,7 +611,7 @@ abstract class JdbcDatabase implements Database { private void logConnectionCounts() { if (LOG.isLoggable(FINE)) { LOG.fine(openConnections + " connections open, " - + connections.size() + " in pool"); + + connectionPool.size() + " in pool"); } } @@ -649,14 +654,18 @@ abstract class JdbcDatabase implements Database { } private void returnConnectionToPool(Connection txn) { + boolean shouldClose; connectionsLock.lock(); try { - connections.add(txn); + shouldClose = connectionPool.size() >= MAX_CONNECTION_POOL_SIZE; + if (shouldClose) openConnections--; + else connectionPool.add(txn); logConnectionCounts(); connectionsChanged.signalAll(); } finally { connectionsLock.unlock(); } + if (shouldClose) tryToClose(txn, LOG, WARNING); } void closeAllConnections() { @@ -664,9 +673,9 @@ abstract class JdbcDatabase implements Database { connectionsLock.lock(); try { closed = true; - for (Connection c : connections) tryToClose(c, LOG, WARNING); - openConnections -= connections.size(); - connections.clear(); + for (Connection c : connectionPool) tryToClose(c, LOG, WARNING); + openConnections -= connectionPool.size(); + connectionPool.clear(); while (openConnections > 0) { if (LOG.isLoggable(INFO)) { LOG.info("Waiting for " + openConnections @@ -678,9 +687,9 @@ abstract class JdbcDatabase implements Database { LOG.warning("Interrupted while closing connections"); interrupted = true; } - for (Connection c : connections) tryToClose(c, LOG, WARNING); - openConnections -= connections.size(); - connections.clear(); + for (Connection c : connectionPool) tryToClose(c, LOG, WARNING); + openConnections -= connectionPool.size(); + connectionPool.clear(); } LOG.info("All connections closed"); } finally { From edd270abf34f34cc4982a97dbb62f8e53df87cf5 Mon Sep 17 00:00:00 2001 From: akwizgran Date: Fri, 8 Apr 2022 16:06:35 +0100 Subject: [PATCH 2/2] Keep one connection in the DB pool. For H2, this ensures we're not constantly closing and reopening the DB. --- .../src/main/java/org/briarproject/bramble/db/JdbcDatabase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java index 7bdb7f373..843d4f61f 100644 --- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java +++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java @@ -106,7 +106,7 @@ abstract class JdbcDatabase implements Database { /** * The maximum number of idle connections to keep open. */ - private static final int MAX_CONNECTION_POOL_SIZE = 10; + private static final int MAX_CONNECTION_POOL_SIZE = 1; // Time period offsets for incoming transport keys private static final int OFFSET_PREV = -1;