public class ConnectionPoolManager {

    private final Main plugin;

    private HikariDataSource dataSource;

    private String hostname;
    private String port;
    private String database;
    private String username;
    private String password;

    private int minimumConnections;
    private int maximumConnections;
    private long connectionTimeout;
    private String testQuery;

    public ConnectionPoolManager(Main plugin) {
        this.plugin = plugin;
        init();
        setupPool();
    }

    private void init() {
        hostname = plugin.getConfig().getSQLHostname();
        port = plugin.getConfig().getSQLPort();
        database = plugin.getConfig().getSQLDatabase();
        username = plugin.getConfig().getSQLUsername();
        password = plugin.getConfig().getSQLPassword();
        minimumConnections = plugin.getConfig().getSQLPoolMinimumConnections();
        maximumConnections = plugin.getConfig().getSQLPoolMaximumConnections();
        connectionTimeout = plugin.getConfig().getSQLPoolConnectionTimeoutMillis();
        testQuery = plugin.getConfig().getSQLPoolTestQuery();
    }

    private void setupPool() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(
                "jdbc:mysql://" +
                        hostname +
                        ":" +
                        port +
                        "/" +
                        database
        );
        config.setDriverClassName("com.mysql.jdbc.Driver");
        config.setUsername(username);
        config.setPassword(password);
        config.setMinimumIdle(minimumConnections);
        config.setMaximumPoolSize(maximumConnections);
        config.setConnectionTimeout(connectionTimeout);
        config.setConnectionTestQuery(testQuery);
        dataSource = new HikariDataSource(config);
    }

    public Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

    public void close(Connection conn, PreparedStatement ps, ResultSet res) {
        if (conn != null) try { conn.close(); } catch (SQLException ignored) {}
        if (ps != null) try { ps.close(); } catch (SQLException ignored) {}
        if (res != null) try { res.close(); } catch (SQLException ignored) {}
    }

}

public class SQLManager {
 
    private final Main plugin;
    private final ConnectionPoolManager pool;
 
    public SQLManager(Main plugin) {
        this.plugin = plugin;
        pool = new ConnectionPoolManager(plugin);
        makeTable();
    }

    private void makeTable() {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            conn = pool.getConnection();
            ps = conn.prepareStatement(
                    "CREATE TABLE IF NOT EXISTS `Test` " +
                            "(" +
                            "UUID varchar(30)" +
                            ")"
            );
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            pool.close(conn, ps, null);
        }
    }

}