From 4723a7cbdbca95d4774882c62baeb7ffc923f612 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Tue, 14 Oct 2014 23:59:41 -0400 Subject: [PATCH] Switch to a different ConnectionPool implementation --- pom.xml | 7 +- .../nossr50/database/SQLDatabaseManager.java | 110 ++++++++++-------- 2 files changed, 65 insertions(+), 52 deletions(-) diff --git a/pom.xml b/pom.xml index 8a010e957..69b5360d8 100755 --- a/pom.xml +++ b/pom.xml @@ -147,9 +147,10 @@ 0.0.5-SNAPSHOT - net.snaq - dbpool - 5.1 + org.apache.tomcat + tomcat-jdbc + 7.0.52 + compile diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index 5b8927552..30511e262 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -15,6 +15,9 @@ import java.util.Properties; import java.util.UUID; import java.util.concurrent.locks.ReentrantLock; +import org.apache.tomcat.jdbc.pool.ConnectionPool; +import org.apache.tomcat.jdbc.pool.DataSource; +import org.apache.tomcat.jdbc.pool.PoolProperties; import org.bukkit.scheduler.BukkitRunnable; import com.gmail.nossr50.mcMMO; @@ -29,19 +32,15 @@ import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; -import snaq.db.ConnectionPool; - public final class SQLDatabaseManager implements DatabaseManager { private static final String ALL_QUERY_VERSION = "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy"; private String tablePrefix = Config.getInstance().getMySQLTablePrefix(); - private final int POOL_FETCH_TIMEOUT = 360000; - private final Map cachedUserIDs = new HashMap(); - private ConnectionPool miscPool; - private ConnectionPool loadPool; - private ConnectionPool savePool; + private DataSource miscPool; + private DataSource loadPool; + private DataSource savePool; private ReentrantLock massUpdateLock = new ReentrantLock(); @@ -58,44 +57,57 @@ public final class SQLDatabaseManager implements DatabaseManager { //throw e; // aborts onEnable() Riking if you want to do this, fully implement it. } - Properties connectionProperties = new Properties(); - connectionProperties.put("user", Config.getInstance().getMySQLUserName()); - connectionProperties.put("password", Config.getInstance().getMySQLUserPassword()); - connectionProperties.put("autoReconnect", "true"); - connectionProperties.put("cachePrepStmts", "true"); - connectionProperties.put("prepStmtCacheSize", "64"); - connectionProperties.put("prepStmtCacheSqlLimit", "2048"); - connectionProperties.put("useServerPrepStmts", "true"); - miscPool = new ConnectionPool("mcMMO-Misc-Pool", - 0 /*No Minimum really needed*/, - Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.MISC) /*max pool size */, - Config.getInstance().getMySQLMaxConnections(PoolIdentifier.MISC) /*max num connections*/, - 400 /* idle timeout of connections */, - connectionString, - connectionProperties); - loadPool = new ConnectionPool("mcMMO-Load-Pool", - 1 /*Minimum of one*/, - Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.LOAD) /*max pool size */, - Config.getInstance().getMySQLMaxConnections(PoolIdentifier.LOAD) /*max num connections*/, - 400 /* idle timeout of connections */, - connectionString, - connectionProperties); - savePool = new ConnectionPool("mcMMO-Save-Pool", - 1 /*Minimum of one*/, - Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.SAVE) /*max pool size */, - Config.getInstance().getMySQLMaxConnections(PoolIdentifier.SAVE) /*max num connections*/, - 400 /* idle timeout of connections */, - connectionString, - connectionProperties); - miscPool.init(); // Init first connection - miscPool.registerShutdownHook(); // Auto release on jvm exit just in case - loadPool.init(); - loadPool.registerShutdownHook(); - savePool.init(); - savePool.registerShutdownHook(); + + PoolProperties poolProperties = new PoolProperties(); + poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setUrl(connectionString); + poolProperties.setUsername(Config.getInstance().getMySQLUserName()); + poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); + poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.MISC)); + poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.MISC)); + poolProperties.setInitialSize(0); + poolProperties.setMaxIdle(400); + poolProperties.setMaxWait(-1); + poolProperties.setRemoveAbandoned(true); + poolProperties.setRemoveAbandonedTimeout(60); + poolProperties.setTestOnBorrow(true); + poolProperties.setValidationQuery("SELECT 1"); + poolProperties.setValidationInterval(30000); + miscPool = new DataSource(poolProperties); + poolProperties = new PoolProperties(); + poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setUrl(connectionString); + poolProperties.setUsername(Config.getInstance().getMySQLUserName()); + poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); + poolProperties.setInitialSize(0); + poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.SAVE)); + poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.SAVE)); + poolProperties.setMaxIdle(400); + poolProperties.setMaxWait(-1); + poolProperties.setRemoveAbandoned(true); + poolProperties.setRemoveAbandonedTimeout(60); + poolProperties.setTestOnBorrow(true); + poolProperties.setValidationQuery("SELECT 1"); + poolProperties.setValidationInterval(30000); + savePool = new DataSource(poolProperties); + poolProperties = new PoolProperties(); + poolProperties.setDriverClassName("com.mysql.jdbc.Driver"); + poolProperties.setUrl(connectionString); + poolProperties.setUsername(Config.getInstance().getMySQLUserName()); + poolProperties.setPassword(Config.getInstance().getMySQLUserPassword()); + poolProperties.setInitialSize(0); + poolProperties.setMaxIdle(Config.getInstance().getMySQLMaxPoolSize(PoolIdentifier.LOAD)); + poolProperties.setMaxActive(Config.getInstance().getMySQLMaxConnections(PoolIdentifier.LOAD)); + poolProperties.setMaxIdle(400); + poolProperties.setMaxWait(-1); + poolProperties.setRemoveAbandoned(true); + poolProperties.setRemoveAbandonedTimeout(60); + poolProperties.setTestOnBorrow(true); + poolProperties.setValidationQuery("SELECT 1"); + poolProperties.setValidationInterval(30000); + loadPool = new DataSource(poolProperties); checkStructure(); - } public void purgePowerlessUsers() { @@ -1094,13 +1106,13 @@ public final class SQLDatabaseManager implements DatabaseManager { Connection connection = null; switch (identifier) { case LOAD: - connection = loadPool.getConnection(POOL_FETCH_TIMEOUT); + connection = loadPool.getConnection(); break; case MISC: - connection = miscPool.getConnection(POOL_FETCH_TIMEOUT); + connection = miscPool.getConnection(); break; case SAVE: - connection = savePool.getConnection(POOL_FETCH_TIMEOUT); + connection = savePool.getConnection(); break; } if (connection == null) { @@ -1594,9 +1606,9 @@ public final class SQLDatabaseManager implements DatabaseManager { @Override public void onDisable() { mcMMO.p.debug("Releasing connection pool resource..."); - miscPool.release(); - loadPool.release(); - savePool.release(); + miscPool.close(); + loadPool.close(); + savePool.close(); } public enum PoolIdentifier {