Solved MySQL connection failed

Discussion in 'Plugin Development' started by lolux, Aug 16, 2019.

Thread Status:
Not open for further replies.
  1. Offline

    lolux

    Hi,

    I'm trying to make a plugin to manage the players grade. To do this i'm trying to connect to a MySQL database.

    When I'm running my server, I've got this error:

    Error Message (open)

    Code:
    [20:33:48 INFO]: [GradeManager] Loading GradeManager v1.0
    [20:33:48 INFO]: [GradeManager] Enabling GradeManager v1.0
    [20:33:48 WARN]: java.lang.ClassNotFoundException: com.mysql.jbdc.Driver
    [20:33:48 WARN]:        at java.net.URLClassLoader.findClass(Unknown Source)
    [20:33:48 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101)
    [20:33:48 WARN]:        at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86)
    [20:33:48 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
    [20:33:48 WARN]:        at java.lang.ClassLoader.loadClass(Unknown Source)
    [20:33:48 WARN]:        at java.lang.Class.forName0(Native Method)
    [20:33:48 WARN]:        at java.lang.Class.forName(Unknown Source)
    [20:33:48 WARN]:        at fr.CounterCraft.GradeManager.main.DbConnection.connect(DbConnection.java:29)
    [20:33:48 WARN]:        at fr.CounterCraft.GradeManager.main.DbConnection.<init>(DbConnection.java:21)
    [20:33:48 WARN]:        at fr.CounterCraft.GradeManager.main.DatabaseManager.<init>(DatabaseManager.java:13)
    [20:33:48 WARN]:        at fr.CounterCraft.GradeManager.main.Main.onEnable(Main.java:21)
    [20:33:48 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321)
    [20:33:48 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340)
    [20:33:48 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405)
    [20:33:48 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357)
    [20:33:48 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317)
    [20:33:48 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.reload(CraftServer.java:741)
    [20:33:48 WARN]:        at org.bukkit.Bukkit.reload(Bukkit.java:535)
    [20:33:48 WARN]:        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25)
    [20:33:48 WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
    [20:33:48 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641)
    [20:33:48 WARN]:        at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchServerCommand(CraftServer.java:627)
    [20:33:48 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.aO(DedicatedServer.java:412)
    [20:33:48 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:375)
    [20:33:48 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654)
    [20:33:48 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557)
    [20:33:48 WARN]:        at java.lang.Thread.run(Unknown Source)
    [20:33:48 INFO]: [CounterCraft] GradeManager succesfully launched


    I've got these classes:

    Main (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    import java.util.HashMap;
    import java.util.UUID;
    
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class Main extends JavaPlugin{
      
        public static Main INSTANCE;
      
        private DatabaseManager databaseManager;
        private HashMap<UUID, String> playerGrades;
      
      
        public void onEnable(){
          
            INSTANCE = this;
          
          
            this.databaseManager = new DatabaseManager();
            this.playerGrades = new HashMap<>();
          
            this.getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
            this.getServer().getPluginManager().registerEvents(new PlayerChatListener(this), this);
          
            System.out.println("[CounterCraft] GradeManager succesfully launched");
        }
      
        public void onDisable(){
          
            this.databaseManager.close();
            System.out.println("[CounterCraft] GradeManager succesfully stop");
        }
    
        public DatabaseManager getDatabaseManager() {
            return databaseManager;
        }
    
        public HashMap<UUID, String> getPlayerGrades() {
            return playerGrades;
        }
      
      
      
    }
    


    DatabaseManager (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    import java.sql.SQLException;
    
    public class DatabaseManager {
      
        //manage the connections
      
        private DbConnection gradeConnection;
      
        public DatabaseManager(){
                  
            this.gradeConnection = new DbConnection(new DbCredentials("localhost", "CounterCraftBDDAdmin", "mi85p73eqx7X2iA4", "countercraft_bdd", 3306));
          
        }
      
        public DbConnection getGradeConnection() {
            return gradeConnection;
        }
      
      
        public void close(){
          
            try {
                this.gradeConnection.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    


    DbConnection (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.util.logging.Logger;
    
    public class DbConnection {
    
        //setting up connection parameters
      
        private DbCredentials dbCredentials;
        private Connection connection;
      
      
      
      
        public DbConnection(DbCredentials dbCredentials){
          
            this.dbCredentials = dbCredentials;
            this.connect();
          
        }
      
        private void connect(){
          
            try {
          
                Class.forName("com.mysql.jbdc.Driver");
              
                this.connection = DriverManager.getConnection(this.dbCredentials.toURI(), this.dbCredentials.getUser(), this.dbCredentials.getPass());
          
              
              
                Logger.getLogger("GradeManager").info("Succesfully connect to DB");
          
            } catch (SQLException | ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          
        }
      
        protected void close() throws SQLException{
          
            if(this.connection != null){
              
                if(!this.connection.isClosed()){
                  
                    this.connection.close();
                }
            }
          
        }
      
        public Connection getConnection() throws SQLException{
          
            if(this.connection != null){
              
                if(!this.connection.isClosed()){
                  
                    return this.connection;
                }
            }
          
            connect();
            return this.connection;
          
        }
    }
    


    DbCredentials (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    public class DbCredentials {
    
        //setting up db credentials
      
        private String host;
        private String user;
        private String pass;
        private String dbName;
        private int port;
      
        protected void start(){
          
        }
    
      
        public DbCredentials(String host, String user, String pass, String dbName, int port) {
          
            this.host = host;
            this.user = user;
            this.pass = pass;
            this.dbName = dbName;
            this.port = port;
        }
    
        public String toURI() {
          
            final StringBuilder sb = new StringBuilder();
          
            sb.append("jbdc:mysql://")
                .append(host)
                .append(":")
                .append(port)
                .append("/")
                .append(dbName);
          
            return sb.toString();
          
        }
      
        public String getUser() {
    
            return user;
        }
    
    
        public String getPass() {
    
            return pass;
        }
      
        public String getHost() {
    
            return host;
        }
    
    
        public String getDbName() {
    
            return dbName;
        }
      
        public int getPort() {
          
            return port;
        }
      
    }
    


    PlayerChatListener (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    import java.util.UUID;
    
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.AsyncPlayerChatEvent;
    
    public class PlayerChatListener implements Listener {
    
      
        private Main main;
      
      
      
        public PlayerChatListener(Main main) {
            this.main = main;
        }
    
    
    
        @EventHandler
      
        public void onPlayerChat(AsyncPlayerChatEvent event){
          
            final Player player = event.getPlayer();
            final UUID uuid = player.getUniqueId();
          
          
            if(main.getPlayerGrades().containsKey(uuid)){
              
                final String grade = main.getPlayerGrades().get(uuid);
              
                event.setFormat("[" + grade + "] - " + player.getDisplayName() + " : " + event.getMessage());
            }
        }
      
    }
    


    PlayerJoinListener (open)

    Code:
    package fr.CounterCraft.GradeManager.main;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Timestamp;
    import java.util.UUID;
    
    import org.bukkit.Bukkit;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerJoinEvent;
    
    public class PlayerJoinListener implements Listener {
      
        //checking in db for player rank when connecting to server
      
        private Main main;
      
      
        public PlayerJoinListener(Main main){
          
            this.main = main;
        }
      
        @EventHandler
      
        public void onPlayerJoin(PlayerJoinEvent event){
          
            final UUID uuid = event.getPlayer().getUniqueId();
            final DbConnection gradeConnection = main.getDatabaseManager().getGradeConnection();
          
          
            Bukkit.getScheduler().runTaskAsynchronously(main, ()->{
              
                try {
                  
                    final Connection connection = gradeConnection.getConnection();
                  
                    final PreparedStatement preparedStatement = connection.prepareStatement("SELECT uuid, grade FROM player_grades WHERE uuid = ?");
                    preparedStatement.setString(1, uuid.toString());
                    final ResultSet resultSet = preparedStatement.executeQuery();
                  
                    if(resultSet.next()){
                      
                        final String grade = resultSet.getString("grade");
                      
                        main.getPlayerGrades().put(uuid, grade);
                      
                    } else {
                      
                        createUserGrade(connection, uuid);
                      
                    }
                  
                  
                  
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
              
            });
          
          
        }
      
      
        private void createUserGrade(Connection connection, UUID uuid){
          
            try {
              
                final PreparedStatement preparedStatement = connection.prepareStatement("INSERT INTO player_grades VALUES (?, ?, ?, ?)");
              
                final long time = System.currentTimeMillis();  
              
                preparedStatement.setString(1, uuid.toString());
                preparedStatement.setString(2, "Joueur");
                preparedStatement.setTimestamp(3, new Timestamp(time)); //creation date
                preparedStatement.setTimestamp(4, new Timestamp(time)); //last update
              
                preparedStatement.executeUpdate();
              
                main.getPlayerGrades().put(uuid, "Joueur"); // configurate basic grade
              
              
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    


    What I have tried:

    • Manually added the librairy mysql-connector-java (thinking it was the spigot one which didn't work)
    • Checked every MySQL code to be sure it's not a writing error
    • Tried a class.forName to see if the class can access succesfully to the jdbc.Driver class
    • Changed IDE after read on Google that sometimes Eclipse can bug on MySQL connection

    I don't know where it can come from, I don't know what to try to fix it.

    Thank you for the reading time you spent ;)
     
    Last edited: Aug 16, 2019
  2. Offline

    lolux

    I finaly found the error, I wrote jbdc.Driver and I should wrote jdbc.Driver.
     
    robertlit likes this.
Thread Status:
Not open for further replies.

Share This Page