From 1396d6d9adb1712cd9e1bc3ae0324d52f1b96bc2 Mon Sep 17 00:00:00 2001 From: t00thpick1 Date: Sat, 26 Jul 2014 00:00:40 -0400 Subject: [PATCH] Explicitly close every resource --- .../nossr50/database/DatabaseManager.java | 5 + .../database/FlatfileDatabaseManager.java | 3 + .../nossr50/database/SQLDatabaseManager.java | 146 +++++++++++++----- src/main/java/com/gmail/nossr50/mcMMO.java | 1 + 4 files changed, 113 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java index af0521b58..0e180d016 100644 --- a/src/main/java/com/gmail/nossr50/database/DatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/DatabaseManager.java @@ -132,4 +132,9 @@ public interface DatabaseManager { * @return The type of database */ public DatabaseType getDatabaseType(); + + /** + * Called when the plugin disables + */ + public void onDisable(); } diff --git a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java index e5d4588eb..c30b4fac7 100644 --- a/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/FlatfileDatabaseManager.java @@ -1041,4 +1041,7 @@ public final class FlatfileDatabaseManager implements DatabaseManager { public DatabaseType getDatabaseType() { return DatabaseType.FLATFILE; } + + @Override + public void onDisable() { } } diff --git a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java index e27596d4d..aec940c65 100644 --- a/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java +++ b/src/main/java/com/gmail/nossr50/database/SQLDatabaseManager.java @@ -29,6 +29,7 @@ import com.gmail.nossr50.runnables.database.UUIDUpdateAsyncTask; import com.gmail.nossr50.util.Misc; 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 connectionString; private String tablePrefix = Config.getInstance().getMySQLTablePrefix(); @@ -50,9 +51,15 @@ public final class SQLDatabaseManager implements DatabaseManager { connectionProperties.put("user", Config.getInstance().getMySQLUserName()); connectionProperties.put("password", Config.getInstance().getMySQLUserPassword()); connectionProperties.put("autoReconnect", "false"); - connectionPool = new ConnectionPool("mcMMO-Pool", 1 /*Minimum of one*/, 10 /*max pool size Configurable?*/, 10/*max num connections Configurable?*/, 0 /* idle timeout of connections */, connectionString, connectionProperties); + connectionPool = new ConnectionPool("mcMMO-Pool", + 1 /*Minimum of one*/, + 10 /*max pool size */, // TODO Configurable? + 10 /*max num connections*/, // TODO Configurable? + 0 /* idle timeout of connections */, + connectionString, + connectionProperties); connectionPool.init(); // Init first connection - connectionPool.registerShutdownHook(); // Auto release when done + connectionPool.registerShutdownHook(); // Auto release on jvm exit just in case } catch (ClassNotFoundException e) { // TODO tft do something here e.printStackTrace(); @@ -81,13 +88,12 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet.close(); - statement.executeQuery("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + + statement.executeUpdate("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) " + "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " + "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " + "JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + "WHERE (s.taming+s.mining+s.woodcutting+s.repair+s.unarmed+s.herbalism+s.excavation+s.archery+s.swords+s.axes+s.acrobatics+s.fishing) = 0"); - } catch (SQLException ex) { printErrors(ex); } finally { @@ -140,13 +146,12 @@ public final class SQLDatabaseManager implements DatabaseManager { resultSet.close(); - statement.executeQuery("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + + statement.executeUpdate("DELETE FROM u, e, h, s, c USING " + tablePrefix + "users u " + "JOIN " + tablePrefix + "experience e ON (u.id = e.user_id) " + "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " + "JOIN " + tablePrefix + "skills s ON (u.id = s.user_id) " + "JOIN " + tablePrefix + "cooldowns c ON (u.id = c.user_id) " + "WHERE ((NOW() - lastlogin * " + Misc.TIME_CONVERSION_FACTOR + ") > " + PURGE_TIME + ")"); - } catch (SQLException ex) { printErrors(ex); } finally { @@ -198,7 +203,6 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.setString(1, playerName); success = statement.executeUpdate() != 0; - } catch (SQLException ex) { printErrors(ex); } finally { @@ -306,6 +310,7 @@ public final class SQLDatabaseManager implements DatabaseManager { statement.setLong(8, profile.getAbilityDATS(AbilityType.BLAST_MINING)); statement.setInt(9, id); success = (statement.executeUpdate() != 0); + statement.close(); statement = connection.prepareStatement("UPDATE " + tablePrefix + "huds SET mobhealthbar = ? WHERE user_id = ?"); statement.setString(1, profile.getMobHealthbarType() == null ? Config.getInstance().getMobHealthbarDefault().name() : profile.getMobHealthbarType().name()); @@ -336,8 +341,8 @@ public final class SQLDatabaseManager implements DatabaseManager { public List readLeaderboard(SkillType skill, int pageNumber, int statsPerPage) { List stats = new ArrayList(); - String query = skill == null ? "taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy" : skill.name().toLowerCase(); - ResultSet resultSet; + String query = skill == null ? ALL_QUERY_VERSION : skill.name().toLowerCase(); + ResultSet resultSet = null; PreparedStatement statement = null; Connection connection = null; @@ -360,6 +365,13 @@ public final class SQLDatabaseManager implements DatabaseManager { } catch (SQLException ex) { printErrors(ex); } finally { + if (resultSet != null) { + try { + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } if (statement != null) { try { statement.close(); @@ -382,7 +394,8 @@ public final class SQLDatabaseManager implements DatabaseManager { public Map readRank(String playerName) { Map skills = new HashMap(); - ResultSet resultSet; + ResultSet resultSet = null; + PreparedStatement statement = null; Connection connection = null; try { @@ -393,7 +406,7 @@ public final class SQLDatabaseManager implements DatabaseManager { "AND " + skillName + " > (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + "WHERE user = ?)"; - PreparedStatement statement = connection.prepareStatement(sql); + statement = connection.prepareStatement(sql); statement.setString(1, playerName); resultSet = statement.executeQuery(); @@ -405,6 +418,7 @@ public final class SQLDatabaseManager implements DatabaseManager { "AND " + skillName + " = (SELECT " + skillName + " FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + "WHERE user = '" + playerName + "') ORDER BY user"; + resultSet.close(); statement.close(); statement = connection.prepareStatement(sql); @@ -417,16 +431,17 @@ public final class SQLDatabaseManager implements DatabaseManager { } } + resultSet.close(); statement.close(); } String sql = "SELECT COUNT(*) AS rank FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + - "WHERE taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy > 0 " + - "AND taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy > " + - "(SELECT taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy " + + "WHERE " + ALL_QUERY_VERSION + " > 0 " + + "AND " + ALL_QUERY_VERSION + " > " + + "(SELECT " + ALL_QUERY_VERSION + " " + "FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = ?)"; - PreparedStatement statement = connection.prepareStatement(sql); + statement = connection.prepareStatement(sql); statement.setString(1, playerName); resultSet = statement.executeQuery(); @@ -434,13 +449,14 @@ public final class SQLDatabaseManager implements DatabaseManager { int rank = resultSet.getInt("rank"); + resultSet.close(); statement.close(); - sql = "SELECT user, taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy " + + sql = "SELECT user, " + ALL_QUERY_VERSION + " " + "FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id " + - "WHERE taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy > 0 " + - "AND taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy = " + - "(SELECT taming+mining+woodcutting+repair+unarmed+herbalism+excavation+archery+swords+axes+acrobatics+fishing+alchemy " + + "WHERE " + ALL_QUERY_VERSION + " > 0 " + + "AND " + ALL_QUERY_VERSION + " = " + + "(SELECT " + ALL_QUERY_VERSION + " " + "FROM " + tablePrefix + "users JOIN " + tablePrefix + "skills ON user_id = id WHERE user = ?) ORDER BY user"; statement = connection.prepareStatement(sql); @@ -454,10 +470,25 @@ public final class SQLDatabaseManager implements DatabaseManager { } } + resultSet.close(); statement.close(); } catch (SQLException ex) { printErrors(ex); } finally { + if (resultSet != null) { + try { + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } + if (statement != null) { + try { + statement.close(); + } catch (SQLException e) { + // Ignore + } + } if (connection != null) { try { connection.close(); @@ -534,6 +565,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private PlayerProfile loadPlayerNameProfile(String playerName, String uuid, boolean create, boolean retry) { PreparedStatement statement = null; Connection connection = null; + ResultSet resultSet = null; try { connection = connectionPool.getConnection(VALID_TIMEOUT); @@ -566,20 +598,25 @@ public final class SQLDatabaseManager implements DatabaseManager { + "WHERE u.user = ?"); statement.setString(1, playerName); - ResultSet result = statement.executeQuery(); + resultSet = statement.executeQuery(); - if (result.next()) { + if (resultSet.next()) { try { - PlayerProfile ret = loadFromResult(playerName, result); - result.close(); + PlayerProfile ret = loadFromResult(playerName, resultSet); return ret; } catch (SQLException e) { } } - result.close(); } catch (SQLException ex) { printErrors(ex); } finally { + if (resultSet != null) { + try { + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } if (statement != null) { try { statement.close(); @@ -623,6 +660,7 @@ public final class SQLDatabaseManager implements DatabaseManager { private PlayerProfile loadPlayerProfile(String playerName, String uuid, boolean create, boolean retry) { PreparedStatement statement = null; Connection connection = null; + ResultSet resultSet = null; try { connection = connectionPool.getConnection(VALID_TIMEOUT); @@ -655,12 +693,12 @@ public final class SQLDatabaseManager implements DatabaseManager { + "WHERE u.UUID = ?"); statement.setString(1, uuid); - ResultSet result = statement.executeQuery(); + resultSet = statement.executeQuery(); - if (result.next()) { + if (resultSet.next()) { try { - PlayerProfile profile = loadFromResult(playerName, result); - result.close(); + PlayerProfile profile = loadFromResult(playerName, resultSet); + resultSet.close(); statement.close(); if (!playerName.isEmpty() && !profile.getPlayerName().isEmpty()) { @@ -670,18 +708,25 @@ public final class SQLDatabaseManager implements DatabaseManager { + "WHERE UUID = ?"); statement.setString(1, playerName); statement.setString(2, uuid); - result = statement.executeQuery(); - result.close(); + statement.executeUpdate(); + statement.close(); } return profile; } catch (SQLException e) { } } - result.close(); + resultSet.close(); } catch (SQLException ex) { printErrors(ex); } finally { + if (resultSet != null) { + try { + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } if (statement != null) { try { statement.close(); @@ -712,6 +757,7 @@ public final class SQLDatabaseManager implements DatabaseManager { public void convertUsers(DatabaseManager destination) { PreparedStatement statement = null; Connection connection = null; + ResultSet resultSet = null; try { connection = connectionPool.getConnection(VALID_TIMEOUT); @@ -728,7 +774,6 @@ public final class SQLDatabaseManager implements DatabaseManager { + "JOIN " + tablePrefix + "huds h ON (u.id = h.user_id) " + "WHERE u.user = ?"); List usernames = getStoredUsers(); - ResultSet resultSet; int convertedUsers = 0; long startMillis = System.currentTimeMillis(); for (String playerName : usernames) { @@ -747,6 +792,13 @@ public final class SQLDatabaseManager implements DatabaseManager { } catch (SQLException e) { printErrors(e); } finally { + if (resultSet != null) { + try { + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } if (statement != null) { try { statement.close(); @@ -797,8 +849,6 @@ public final class SQLDatabaseManager implements DatabaseManager { } } } - - // Problem, nothing was returned } public boolean saveUserUUIDs(Map fetchedUUIDs) { @@ -854,23 +904,30 @@ public final class SQLDatabaseManager implements DatabaseManager { public List getStoredUsers() { ArrayList users = new ArrayList(); - Statement stmt = null; + Statement statement = null; Connection connection = null; + ResultSet resultSet = null; try { connection = connectionPool.getConnection(VALID_TIMEOUT); - stmt = connection.createStatement(); - ResultSet result = stmt.executeQuery("SELECT user FROM " + tablePrefix + "users"); - while (result.next()) { - users.add(result.getString("user")); + statement = connection.createStatement(); + resultSet = statement.executeQuery("SELECT user FROM " + tablePrefix + "users"); + while (resultSet.next()) { + users.add(resultSet.getString("user")); } - result.close(); } catch (SQLException e) { printErrors(e); } finally { - if (stmt != null) { + if (resultSet != null) { try { - stmt.close(); + resultSet.close(); + } catch (SQLException e) { + // Ignore + } + } + if (statement != null) { + try { + statement.close(); } catch (SQLException e) { // Ignore } @@ -1468,4 +1525,9 @@ public final class SQLDatabaseManager implements DatabaseManager { return -1; } + + @Override + public void onDisable() { + connectionPool.release(); + } } diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index d4ea83366..2d496443f 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -242,6 +242,7 @@ public class mcMMO extends JavaPlugin { } } + databaseManager.onDisable(); debug("Was disabled."); // How informative! }