From 8a6a4d61f2c4c69f4334335a234bbb1d0c3efbf6 Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Fri, 9 Apr 2021 17:19:08 -0500 Subject: [PATCH] Load database async and add exception handling. Hikari seems to print it's own stacktrace even when you catch the exception. --- .../Aust1n46/chat/MineverseChat.java | 6 +- .../Aust1n46/chat/database/Database.java | 77 ++++++++++--------- 2 files changed, 44 insertions(+), 39 deletions(-) diff --git a/src/mineverse/Aust1n46/chat/MineverseChat.java b/src/mineverse/Aust1n46/chat/MineverseChat.java index 834245f..adb60ee 100644 --- a/src/mineverse/Aust1n46/chat/MineverseChat.java +++ b/src/mineverse/Aust1n46/chat/MineverseChat.java @@ -227,8 +227,10 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { mcp.setJsonFormat(); MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); } - - Database.initializeMySQL(); + + Bukkit.getScheduler().runTaskAsynchronously(this, () -> { + Database.initializeMySQL(); + }); commands.put("broadcast", new Broadcast("broadcast")); commands.put("channel", new Channel("channel")); diff --git a/src/mineverse/Aust1n46/chat/database/Database.java b/src/mineverse/Aust1n46/chat/database/Database.java index b3dc867..b65bd8c 100644 --- a/src/mineverse/Aust1n46/chat/database/Database.java +++ b/src/mineverse/Aust1n46/chat/database/Database.java @@ -13,61 +13,65 @@ import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariDataSource; import mineverse.Aust1n46.chat.MineverseChat; +import mineverse.Aust1n46.chat.utilities.Format; /** * Initializes and handles writing to the chat logging database. */ public class Database { private static HikariDataSource dataSource = null; - + public static void initializeMySQL() { - ConfigurationSection mysqlConfig = MineverseChat.getInstance().getConfig().getConfigurationSection("mysql"); - if (mysqlConfig.getBoolean("enabled", false)) { - String host = mysqlConfig.getString("host"); - int port = mysqlConfig.getInt("port"); - String database = mysqlConfig.getString("database"); - String user = mysqlConfig.getString("user"); - String password = mysqlConfig.getString("password"); - - final HikariConfig config = new HikariConfig(); - //config.setDriverClassName(org.postgresql.Driver.class.getName()); - //final String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", hostname, port, database); - final String jdbcUrl = String.format("jdbc:mysql://%s:%d/%s?autoReconnect=true&useSSL=false", host, port, database); - config.setJdbcUrl(jdbcUrl); - config.setUsername(user); - config.setPassword(password); - config.addDataSourceProperty("cachePrepStmts", "true"); - config.addDataSourceProperty("prepStmtCacheSize", "250"); - config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - dataSource = new HikariDataSource(config); - final String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS VentureChat " + - "(ID SERIAL PRIMARY KEY, ChatTime TEXT, UUID TEXT, Name TEXT, " + - "Server TEXT, Channel TEXT, Text TEXT, Type TEXT)"; - try (final Connection conn = dataSource.getConnection(); - final PreparedStatement statement = conn.prepareStatement(SQL_CREATE_TABLE)) { - statement.executeUpdate(); - } - catch (SQLException e) { - throw new RuntimeException(e); + try { + ConfigurationSection mysqlConfig = MineverseChat.getInstance().getConfig().getConfigurationSection("mysql"); + if (mysqlConfig.getBoolean("enabled", false)) { + String host = mysqlConfig.getString("host"); + int port = mysqlConfig.getInt("port"); + String database = mysqlConfig.getString("database"); + String user = mysqlConfig.getString("user"); + String password = mysqlConfig.getString("password"); + + final HikariConfig config = new HikariConfig(); + // config.setDriverClassName(org.postgresql.Driver.class.getName()); + // final String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", hostname, + // port, database); + final String jdbcUrl = String.format("jdbc:mysql://%s:%d/%s?autoReconnect=true&useSSL=false", host, + port, database); + config.setJdbcUrl(jdbcUrl); + config.setUsername(user); + config.setPassword(password); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + dataSource = new HikariDataSource(config); + final String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS VentureChat " + + "(ID SERIAL PRIMARY KEY, ChatTime TEXT, UUID TEXT, Name TEXT, " + + "Server TEXT, Channel TEXT, Text TEXT, Type TEXT)"; + final Connection conn = dataSource.getConnection(); + final PreparedStatement statement = conn.prepareStatement(SQL_CREATE_TABLE); + statement.executeUpdate(); } + } catch (Exception exception) { + Bukkit.getConsoleSender().sendMessage( + Format.FormatStringAll("&8[&eVentureChat&8]&c - Database could not be loaded. Is it running?")); } } - + public static boolean isEnabled() { return dataSource != null; } - public static void writeVentureChat(String uuid, String name, String server, String channel, String text, String type) { + public static void writeVentureChat(String uuid, String name, String server, String channel, String text, + String type) { MineverseChat plugin = MineverseChat.getInstance(); Calendar currentDate = Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = formatter.format(currentDate.getTime()); Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - try(final Connection conn = dataSource.getConnection(); + try (final Connection conn = dataSource.getConnection(); final PreparedStatement statement = conn.prepareStatement( - "INSERT INTO VentureChat " + - "(ChatTime, UUID, Name, Server, Channel, Text, Type) " + - "VALUES (?, ?, ?, ?, ?, ?, ?)")) { + "INSERT INTO VentureChat " + "(ChatTime, UUID, Name, Server, Channel, Text, Type) " + + "VALUES (?, ?, ?, ?, ?, ?, ?)")) { statement.setString(1, date); statement.setString(2, uuid); statement.setString(3, name); @@ -76,8 +80,7 @@ public class Database { statement.setString(6, text); statement.setString(7, type); statement.executeUpdate(); - } - catch(SQLException error) { + } catch (SQLException error) { error.printStackTrace(); } });