• Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

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

Mc_Skyer

Minecrafter
Registriert
20 März 2015
Beiträge
29
Alter
26
Diamanten
300
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:
package MySQL;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import me.Mc_Techno.ScoreStats.main;

import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

public class MySQL {

   
    public static String host;
    public static String port;
    public static String database;
    public static String username;
    public static String passwort;
    public static Connection con;
   
    public static void connect() {
        if(!isConnected()) {
            try {
                con = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database + "?autoReconnect=true",username,passwort);
                System.out.println(main.prefix + "MySQL verbindung aufgebaut!");
            } catch (SQLException e) {
                e.printStackTrace();
                System.out.println(main.prefix + "MySQL verbindung fehlgeschlagen.");
            }
        }
    }
   
    public static void disconnect() {
        if(isConnected()) {
            try {
                con.close();
                System.out.println(main.prefix + "MySQL verbindung geschlossen!");
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
   
    public static boolean isConnected() {
        return (con == null ? false : true);
       
    }
   
    public static Connection getConnection() {
        return con;
    }
   
    // File
    public void setStandart() {
        FileConfiguration cfg = getFileConfiguration();
        cfg.options().copyDefaults(true);
        cfg.addDefault("MySQL.host", "");
        cfg.addDefault("MySQL.port", "");
        cfg.addDefault("MySQL.database", "");
        cfg.addDefault("MySQL.username", "");
        cfg.addDefault("MySQL.passwort", "");
       
        try {
            cfg.save(getFile());
        } catch (IOException e) {
            e.printStackTrace();
        }
       
    }
   
    private File getFile() {
        return new File("plugins/ScoreStats", "config.yml");
    }
   
    private FileConfiguration getFileConfiguration() {
        return YamlConfiguration.loadConfiguration(getFile());
    }
   
    public void readData() {
        FileConfiguration cfg = getFileConfiguration();
       
        host = cfg.getString("MySQL.host");
        port = cfg.getString("MySQL.port");
        database = cfg.getString("MySQL.database");
        username = cfg.getString("MySQL.username");
        passwort = cfg.getString("MySQL.passwort");
       
    }
   
}

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

Code:
package MySQL;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.UUID;

import me.Mc_Techno.ScoreStats.main;

public class Token {

    public static boolean isUserExists(UUID uuid) {
        try {
            PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT Token FROM Tokens_Coins WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }
   
    public static void update(UUID uuid,int ammount) {
        if(!isUserExists(uuid)) {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("INSERT INTO Tokens_Coins(UUID,Token) VALUES (?,?)");
                ps.setString(1, uuid.toString());
                ps.setInt(2, ammount);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("UPDATE Tokens_Coins SET Token = ? WHERE UUID = ?");
                ps.setString(2, uuid.toString());
                ps.setInt(1, ammount);
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
   
    public static void delete(UUID uuid) {
        if(isUserExists(uuid)) {
            try {
                PreparedStatement ps = MySQL.getConnection().prepareStatement("DELETE * FROM Tokens_Coins WHERE UUID = ?");
                ps.setString(1, uuid.toString());
            } catch (SQLException e) {
                e.printStackTrace();
            }
           
        } else {
            System.err.print(main.prefix + "Der Spieler mit der UUID: " + uuid.toString() + " ist nicht in MySQL eingetragen.");
        }
    }
   
    public static Integer getSpiele(UUID uuid) {
        try {
            PreparedStatement ps = MySQL.getConnection().prepareStatement("SELECT Token FROM Tokens_Coins WHERE UUID = ?");
            ps.setString(1, uuid.toString());
            ResultSet rs = ps.executeQuery();
            while(rs.next()) {
                return rs.getInt("Token");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
       
    }
   
}
 

Mc_Skyer

Minecrafter
Registriert
20 März 2015
Beiträge
29
Alter
26
Diamanten
300
Hab grade nen Fehler code entdeckt

PHP:
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.
[13:20:30 WARN]:        at sun.reflect.GeneratedConstructorAccessor59.newInstance(Unknown Source)
[13:20:30 WARN]:        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
[13:20:30 WARN]:        at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
[13:20:30 WARN]:        at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
[13:20:30 WARN]:        at com.mysql.jdbc.SQLError.createCommunication***ception(SQLError.java:1116)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3082)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2968)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3516)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
[13:20:30 WARN]:        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
[13:20:30 WARN]:        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
[13:20:30 WARN]:        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2273)
[13:20:30 WARN]:        at MySQL.Token.isUserExists(Token.java:18)
[13:20:30 WARN]:        at Listeners.Player_Join_Quit_Event.onJoin(Player_Join_Quit_Event.java:34)
[13:20:30 WARN]:        at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
[13:20:30 WARN]:        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[13:20:30 WARN]:        at java.lang.reflect.Method.invoke(Method.java:606)
[13:20:30 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306)
[13:20:30 WARN]:        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
[13:20:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502)
[13:20:30 WARN]:        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.onPlayerJoin(PlayerList.java:298)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.PlayerList.a(PlayerList.java:157)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.b(LoginListener.java:144)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.LoginListener.c(LoginListener.java:54)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.NetworkManager.a(NetworkManager.java:231)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.ServerConnection.c(ServerConnection.java:148)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:813)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:653)
[13:20:30 WARN]:        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:556)
[13:20:30 WARN]:        at java.lang.Thread.run(Thread.java:745)
[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.
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2529)
[13:20:30 WARN]:        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979)
[13:20:30 WARN]:        ... 27 more
 
K

_K3vin

Guest
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.
 

CoLu

Braumeister
Registriert
31 Oktober 2013
Beiträge
313
Diamanten
0
Minecraft
CoLu
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.
Wenn er seine isConnected()-Methode verwenden würde, kann er sich die Scheduler sparen.
 
Oben