From 540b98ae9b7448b30ab036aabb5f6e79d387a282 Mon Sep 17 00:00:00 2001 From: akwizgran <michael@briarproject.org> Date: Fri, 15 Mar 2013 17:44:38 +0000 Subject: [PATCH] Limit the number of database threads. --- .../src/net/sf/briar/db/DatabaseModule.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/briar-core/src/net/sf/briar/db/DatabaseModule.java b/briar-core/src/net/sf/briar/db/DatabaseModule.java index 540a2990d3..a500f9cf93 100644 --- a/briar-core/src/net/sf/briar/db/DatabaseModule.java +++ b/briar-core/src/net/sf/briar/db/DatabaseModule.java @@ -1,8 +1,12 @@ package net.sf.briar.db; +import static java.util.concurrent.TimeUnit.MILLISECONDS; + import java.sql.Connection; +import java.util.concurrent.BlockingQueue; import java.util.concurrent.Executor; -import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; import net.sf.briar.api.clock.Clock; import net.sf.briar.api.clock.SystemClock; @@ -17,11 +21,24 @@ import com.google.inject.Singleton; public class DatabaseModule extends AbstractModule { + /** + * The maximum number of database threads. When a task is submitted to the + * database executor and no thread is available to run it, the task will be + * queued. + */ + private static final int MAX_DB_THREADS = 10; + + /** How many milliseconds to keep idle threads alive. */ + private static final int DB_KEEPALIVE = 60 * 1000; + @Override protected void configure() { bind(DatabaseCleaner.class).to(DatabaseCleanerImpl.class); + // Use an unbounded queue to prevent deadlock between submitted tasks + BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(); bind(Executor.class).annotatedWith(DatabaseExecutor.class).toInstance( - Executors.newCachedThreadPool()); + new ThreadPoolExecutor(MAX_DB_THREADS, MAX_DB_THREADS, + DB_KEEPALIVE, MILLISECONDS, queue)); } @Provides -- GitLab