ServerPlugin MySQL - Nach längerer Zeit auf dem Server wird die MySQL für einen Spieler gelöscht

Dieses Thema im Forum "Programmierung" wurde erstellt von Mc_Skyer, 26. März 2016.

  1. Mc_Skyer
    Offline

    Mc_Skyer

    Registriert seit:
    20. März 2015
    Beiträge:
    29
    Hallo
    ich habe ein Plugin geschrieben, in dem ein Scorboard ist, was anzeigt wie viel Tokens / Coins man hat. Dieses habe ich auf alle Server gepackt (RootServer). Nach einiger Zeit auf dem Server (Wenn man mal auf Lobby ist dann in SkyPvP usw.) verschwindet einfach in der MySQL der Token und Coins Wert vom Spieler. Woran könnte das liegen ?

    Hier die Conection der MySQL-Datenbank
    Code (Text):
    1. package MySQL;
    2.  
    3. import java.io.File;
    4. import java.io.IOException;
    5. import java.sql.Connection;
    6. import java.sql.DriverManager;
    7. import java.sql.SQLException;
    8.  
    9. import me.Mc_Techno.ScoreStats.main;
    10.  
    11. import org.bukkit.configuration.file.FileConfiguration;
    12. import org.bukkit.configuration.file.YamlConfiguration;
    13.  
    14. public class MySQL {
    15.  
    16.    
    17.     public static String host;
    18.     public static String port;
    19.     public static String database;
    20.     public static String username;
    21.     public static String passwort;
    22.     public static Connection con;
    23.    
    24.     public static void connect() {
    25.         if(!isConnected()) {
    26.             try {
    27.                 con = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?autoReconnect=true",username,passwort);
    28.                 System.out.println(main.prefix + "MySQL verbindung aufgebaut!");
    29.             } catch (SQLException e) {
    30.                 e.printStackTrace();
    31.                 System.out.println(main.prefix + "MySQL verbindung fehlgeschlagen.");
    32.             }
    33.         }
    34.     }
    35.    
    36.     public static void disconnect() {
    37.         if(isConnected()) {
    38.             try {
    39.                 con.close();
    40.                 System.out.println(main.prefix + "MySQL verbindung geschlossen!");
    41.             } catch (SQLException e) {
    42.                 e.printStackTrace();
    43.             }
    44.         }
    45.     }
    46.    
    47.     public static boolean isConnected() {
    48.         return (con == null ? false : true);
    49.        
    50.     }
    51.    
    52.     public static Connection getConnection() {
    53.         return con;
    54.     }
    55.    
    56.     // File
    57.     public void setStandart() {
    58.         FileConfiguration cfg = getFileConfiguration();
    59.         cfg.options().copyDefaults(true);
    60.         cfg.addDefault("MySQL.host", "");
    61.         cfg.addDefault("MySQL.port", "");
    62.         cfg.addDefault("MySQL.database", "");
    63.         cfg.addDefault("MySQL.username", "");
    64.         cfg.addDefault("MySQL.passwort", "");
    65.        
    66.         try {
    67.             cfg.save(getFile());
    68.         } catch (IOException e) {
    69.             e.printStackTrace();
    70.         }
    71.        
    72.     }
    73.    
    74.     private File getFile() {
    75.         return new File("plugins/ScoreStats", "config.yml");
    76.     }
    77.    
    78.     private FileConfiguration getFileConfiguration() {
    79.         return YamlConfiguration.loadConfiguration(getFile());
    80.     }
    81.    
    82.     public void readData() {
    83.         FileConfiguration cfg = getFileConfiguration();
    84.        
    85.         host = cfg.getString("MySQL.host");
    86.         port = cfg.getString("MySQL.port");
    87.         database = cfg.getString("MySQL.database");
    88.         username = cfg.getString("MySQL.username");
    89.         passwort = cfg.getString("MySQL.passwort");
    90.        
    91.     }
    92.    
    93. }
    94.  

    Und hier hole ich mit den Wert und kann auch ihn löschen usw.

    Code (Text):
    1. package MySQL;
    2.  
    3. import java.sql.PreparedStatement;
    4. import java.sql.ResultSet;
    5. import java.sql.SQLException;
    6. import java.util.UUID;
    7.  
    8. import me.Mc_Techno.ScoreStats.main;
    9.  
    10. public class Token {
    11.  
    12.     public static boolean isUserExists(UUID uuid) {
    13.         try {
    14.             PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT Token FROM Tokens_Coins WHERE UUID = ?");
    15.             ps.setString(1, uuid.toString());
    16.             ResultSet rs = ps.executeQuery();
    17.             return rs.next();
    18.         } catch (SQLException e) {
    19.             e.printStackTrace();
    20.         }
    21.         return false;
    22.     }
    23.    
    24.     public static void update(UUID uuid,int ammount) {
    25.         if(!isUserExists(uuid)) {
    26.             try {
    27.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("INSERT INTO Tokens_Coins(UUID,Token) VALUES (?,?)");
    28.                 ps.setString(1, uuid.toString());
    29.                 ps.setInt(2, ammount);
    30.                 ps.executeUpdate();
    31.             } catch (SQLException e) {
    32.                 e.printStackTrace();
    33.             }
    34.         } else {
    35.             try {
    36.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("UPDATE Tokens_Coins SET Token = ? WHERE UUID = ?");
    37.                 ps.setString(2, uuid.toString());
    38.                 ps.setInt(1, ammount);
    39.                 ps.executeUpdate();
    40.             } catch (SQLException e) {
    41.                 e.printStackTrace();
    42.             }
    43.         }
    44.     }
    45.    
    46.     public static void delete(UUID uuid) {
    47.         if(isUserExists(uuid)) {
    48.             try {
    49.                 PreparedStatement ps = MySQL.getConnection().prepareStatement("DELETE * FROM Tokens_Coins WHERE UUID = ?");
    50.                 ps.setString(1, uuid.toString());
    51.             } catch (SQLException e) {
    52.                 e.printStackTrace();
    53.             }
    54.            
    55.         } else {
    56.             System.err.print(main.prefix + "Der Spieler mit der UUID: " + uuid.toString() + " ist nicht in MySQL eingetragen.");
    57.         }
    58.     }
    59.    
    60.     public static Integer getSpiele(UUID uuid) {
    61.         try {
    62.             PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT Token FROM Tokens_Coins WHERE UUID = ?");
    63.             ps.setString(1, uuid.toString());
    64.             ResultSet rs = ps.executeQuery();
    65.             while(rs.next()) {
    66.                 return rs.getInt("Token");
    67.             }
    68.         } catch (SQLException e) {
    69.             e.printStackTrace();
    70.         }
    71.         return 0;
    72.        
    73.     }
    74.    
    75. }
    76.  
     
    #1
  2. Mc_Skyer
    Offline

    Mc_Skyer

    Registriert seit:
    20. März 2015
    Beiträge:
    29
    Hab grade nen Fehler code entdeckt

    PHP:
    1. The last packet successfully received from the server was 340,504 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
    2. [13:20:30 WARN]:        at sun.reflect.GeneratedConstructorAccessor59.newInstance(Unknown Source)
    3. [13:20:30 WARN]:        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    4. [13:20:30 WARN]:        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    5. [13:20:30 WARN]:        at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
    6. [13:20:30 WARN]:        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    7. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3082)
    8. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2968)
    9. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3516)
    10. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
    11. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
    12. [13:20:30 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
    13. [13:20:30 WARN]:        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
    14. [13:20:30 WARN]:        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273)
    15. [13:20:30 WARN]:        at MySQL.Token.isUserExists(Token.java:18)
    16. [13:20:30 WARN]:        at Listeners.Player_Join_Quit_Event.onJoin(Player_Join_Quit_Event.java:34)
    17. [13:20:30 WARN]:        at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
    18. [13:20:30 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    19. [13:20:30 WARN]:        at java.lang.reflect.Method.invoke(Method.java:606)
    20. [13:20:30 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306)
    21. [13:20:30 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    22. [13:20:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
    23. [13:20:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
    24. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.onPlayerJoin(PlayerList.java:298)
    25. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.a(PlayerList.java:157)
    26. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.b(LoginListener.java:144)
    27. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.c(LoginListener.java:54)
    28. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:231)
    29. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:148)
    30. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:813)
    31. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374)
    32. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:653)
    33. [13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:556)
    34. [13:20:30 WARN]:        at java.lang.Thread.run(Thread.java:745)
    35. [13:20:30 WARN]: Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.
    36. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2529)
    37. [13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
    38. [13:20:30 WARN]:        ... 27 more
    39.  
     
    #2
  3. Trasher
    Offline

    Trasher

    Registriert seit:
    14. März 2016
    Beiträge:
    15
    Ort:
    Manching
    Minecraft:
    _Trasher
    Das liegt daran, dass MySQL-Verbindungen welche keine Abfragen durchgeben, nach einiger Zeit beendet werden.

    Lösung: Erstell' einen Scheduler der jede halbe Stunde eine sinnlose Abfrage an die Datenbank sendet, dann wird die Verbindung nicht geschlossen.
     
    #3
    jensIO und Mc_Skyer gefällt das.
  4. Mc_Skyer
    Offline

    Mc_Skyer

    Registriert seit:
    20. März 2015
    Beiträge:
    29
    scheint zu funktionieren thx
     
    #4
  5. CoLu
    Offline

    CoLu

    Registriert seit:
    31. Oktober 2013
    Beiträge:
    314
    Minecraft:
    CoLu
    Wenn er seine isConnected()-Methode verwenden würde, kann er sich die Scheduler sparen.
     
    #5
    Shio gefällt das.
  6. Nightishaman
    Offline

    Nightishaman

    Registriert seit:
    3. Januar 2015
    Beiträge:
    51
    Prüfe einfach vor jeder Abfrage mit if(con.isValid(3)) ob die Verbindung noch besteht ansonsten reconnect
     
    #6
  7. Baba43
    Offline

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    589
    Connection Pool
     
    #7
    [Dev] iTzSasukeHDxLP gefällt das.
  8. Nightishaman
    Offline

    Nightishaman

    Registriert seit:
    3. Januar 2015
    Beiträge:
    51
    isValid ist für die Anfänger einfacher.
     
    #8
  9. Cyrox
    Online

    Cyrox

    Einfach gar keine Datenbank verwenden ist für die Anfänger noch einfacher ...
    Nein ernsthaft Connection Pool ist schon der richtige Weg.
     
    #9
    jensIO gefällt das.