• 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 Tabelle wird nicht erstellt :/

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Hey meine lieben.

wie immer ein Problem. Ich bin seid ungefähr 8h dran ein StatsSystem zu programmieren.
Jetzt mache ich es über Mysql weil performace und so.

ich sag gleich hier ist der code. ich weiß nicht was daran falsch sein soll.
Ja die Connection werd erstellt und funkt!!!!
Code:
package me.skypvpsystem.mysql;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class MySQL {
    
    private static String HOST = "NONE";
    private static String PORT = "NONE";
    private static String DATABASE = "NONE";
    private static String USER = "NONE";
    private static String PASSWORD = "NONE";
    private static Connection con;
    
    public static void connect() {
        if(!isConnected()) {
            try {
                con = DriverManager.getConnection("jdbc:mysql://" + HOST + ":" + PORT + "/" + DATABASE, USER, PASSWORD);
                System.out.print("[MySQL] Verbindung wurde hergestellt");
            } catch (SQLException e) {}
        }
    }
    
    public static void disconnect() {
        if(isConnected()) {
            try {
                con.close();
                System.out.print("[MySQL] Verbindung wurde getrennt");
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public static boolean isConnected() {
        return (con == null ? false : true);
    }
    
    public static void update(String qry) {
        try {
            Statement st = con.createStatement();
            st.executeUpdate(qry);
            st.close();
        } catch (SQLException e) {}
        
    }
    
    public static ResultSet getResult(String qry) {
        
        ResultSet rs = null;
        
        try {
            Statement st = con.createStatement();
            rs = st.executeQuery(qry);
        } catch (SQLException e) {}
        return rs;
    }
    
    
}
Und in der Main wird dann das so gemacht:
Code:
    @Override
    public void onEnable() {
        instance = this;
        Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord");
        
        loadEvents();
        loadCommands();
        loadConfig();
        CreateTopRanks.loadList();
        startScoreboard();
        SB.loadTeam();
        Nick.loadNick();
        KitSystem.loadKit();
        if(getConfig().getBoolean("AutoMessage.Allow") == true) {
            Automessage.onStart();
        }
        MySQL.connect();
        MySQL.update("CREATE TABLE IF NOT EXISTS Stats (UUID VARCHAR(100),KILLS INT(100),DEATHS INT(100),COINS(100))");
    }

Und in der onDisable wird die MySQL wieder geschlossen....

bitte hift mir ;(
 

HansDev

Schafhirte
Registriert
27 September 2018
Beiträge
113
Diamanten
307
Hey Yasuo Krieger,
da du uns keine Logs mitgesendet hast kann ich nur raten was da schief gelaufen ist...
Dem Code zu entnehmen startest du einfach den Server, verbindest ihn dabei mit der MySQL-Datenbank (wovon du gesagt hast dass das wunderbar klappt) und möchtest eine neue Table erstellen. Bei der Table-Erstellung fällt mir vor allem auf, dass du versuchst den INTs eine Größe (100) zuzuweisen. Das ist meines Wissens allerdings gar nicht nötig (bzw nicht möglich?). Zudem hast du (was sehr wahrscheinlich der Fehler ist) dem Wert COINS keinen Typ zugewiesen. Das macht die Table-Erstellung unmöglich.
Richtig müsste es also heißen:
MySQL-Befehl:
 MySQL.update("CREATE TABLE IF NOT EXISTS Stats (UUID VARCHAR(100), KILLS INT, DEATHS INT, COINS INT)");
Ich hoffe ich konnte dir helfen dein Problem zu lösen. Wenn du dich weiter mit MySQL beschäftigen möchtest kann ich dir bei Bedarf auch noch ein paar gute Tutorials und Bücher dazu empfehlen.
Mit freundlichen Grüßen
HansDev
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Was dann noch nicht erwähnt wurde:
Für relationale Datenbanken wie MySQL ist ein primärer Schlüssel (primary key) sinnvoll / notwendig. In deinem Fall wäre der Schlüssel die UUID, weil diese pro Tabelle nur einmalig vorkommen kann. Ohne so einen Schlüssel kann es je nach Datenbank zu eigenartigen Verhalten kommen.

Desweiteren rate ich dir davon ab, deine Datenbankverbindung so zusammen zu schreiben. Benutze ein bestehendes Framework für MySQL-Verbindungen, dann musst du nicht die Bugs fixen, die schon einige vor dir gefixt haben.
Ein Beispiel für eine solche Bilbiothek ist IDB: https://github.com/aikar/db

Und noch eine Sache: MySQL ist nur dann performant, wenn du die Datenbank-Anfragen in einem seperaten Thread ausführst. Während es okay ist, die Tabelle synchron in der onEnable() Methode ausführst, kann es zu Problemen kommen, wenn du die Updates der Stats ebenfalls synchron ausführst. Und solltest du das asynchron behandeln, dann wäre ein ConnectionPool aufjeden fall ratsam, damit nicht deine eine Verbindung durch die ganzen Updates überlastet wird.
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Hey Yasuo Krieger,
da du uns keine Logs mitgesendet hast kann ich nur raten was da schief gelaufen ist...
Dem Code zu entnehmen startest du einfach den Server, verbindest ihn dabei mit der MySQL-Datenbank (wovon du gesagt hast dass das wunderbar klappt) und möchtest eine neue Table erstellen. Bei der Table-Erstellung fällt mir vor allem auf, dass du versuchst den INTs eine Größe (100) zuzuweisen. Das ist meines Wissens allerdings gar nicht nötig (bzw nicht möglich?). Zudem hast du (was sehr wahrscheinlich der Fehler ist) dem Wert COINS keinen Typ zugewiesen. Das macht die Table-Erstellung unmöglich.
Richtig müsste es also heißen:
MySQL-Befehl:
 MySQL.update("CREATE TABLE IF NOT EXISTS Stats (UUID VARCHAR(100), KILLS INT, DEATHS INT, COINS INT)");
Ich hoffe ich konnte dir helfen dein Problem zu lösen. Wenn du dich weiter mit MySQL beschäftigen möchtest kann ich dir bei Bedarf auch noch ein paar gute Tutorials und Bücher dazu empfehlen.
Mit freundlichen Grüßen
HansDev
Omg ja gut das könnte einiges erklären. Schaue mir den code 50 mal an und checke nicht was falsch ist :D
Und jetzt geht ein #ehre an dich da du die Person bist die mir WIRKLICH weitergeholfen hat

@HansDev
Stimmt, den Syntaxfehler hatte ich übersehen. Hinzuzufügen wäre auch, dass UUIDs immer 36 Zeichen lang sind. Also reicht eine feste Begrenzung auf diese Länge mit CHAR(36).
Da die Exceptions in den meisten Methoden nicht geloggt werden, gibt es dazu wahrscheinlich keine Fehlermeldung in der Log.
Es ist eigentlich egal ob man einen wert hinterlegt und auch den char vom UUID ist egal. Das hat damit nichts zu tun
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Und beim nächsten Mal bitte die Fehler richtig behandeln. Ein leerer Catch Block ist immer falsch, gerade wenn man sich sicher ist, dass kein Fehler auftreten kann, weil man den Fall in dem man falsch lag niemals finden wird.
Ehm ne lasse das aus prinzip leer
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Ehm ne lasse das aus prinzip leer
Ist zwar deine Sache - aber wieso?
Es werden ja nicht umsonst Exceptions geworfen und diese sollte man auch behandeln. Und wenn du Angst um vollgespamte Logs hast - genau deswegen sind logs da. Damit man alles was passiert mitbekommt, nicht damit man nur das mitbekommt, was gerade zufällig funktioniert.

Mit der Einstellung wirst du sobald du irgendwelche Probleme debuggen möchtest, mächtig auf die Schnauze fliegen, vor allem, wenn das nicht dein eigener Server ist.
 

Xenoshi

Kuhfänger
Registriert
22 November 2015
Beiträge
77
Diamanten
300
Minecraft
godlessFloof
Dass es daran nicht liegt, ist mir klar. Die (oder zumindest eine) Problemursache wurde ja in dem Post davor bereits geklärt. Mit einem VARCHAR(100) für die UUID-Spalte funktioniert es zwar, eine schlechte Umsetzung ist es aber trotzdem. "Egal" ist das nicht, da die Maximallänge dieses Datentyps für alle Anwendungsfälle ausreichen muss und trotzdem vernünftig (also nicht unnötig hoch) gewählt werden sollte.
Ich hab verstanden aber mit dem Egal meinte ich das es eine Maxi-begrenzung wäre und somit irgendwann zu fehlern kommt, Ja ich habe es geändert.
Mit dem DBuggen, jo ich sehe vielleicht nicht was falsc ist aber ich kann es immer vermuten weil ich eine Sache anfange die 50 mal teste und dann auch fertig bringe. Ich werde mir deine/eure Tipps mal annehmen und schauen was ich drauß mache . Trz danke
 

JOO200

Braumeister
Registriert
18 Dezember 2016
Beiträge
442
Diamanten
228
Mit dem DBuggen, jo ich sehe vielleicht nicht was falsc ist aber ich kann es immer vermuten weil ich eine Sache anfange die 50 mal teste und dann auch fertig bringe. Ich werde mir deine/eure Tipps mal annehmen und schauen was ich drauß mache . Trz danke
Das macht dann auch kein Sinn. Mit einem Stacktrace in den Logs sparst du dir bei der Fehlersuche jede Menge Zeit. Und nur weil das Plugin mit deinen Einstellungen und der eingesetzten MySQL Version funktioniert, muss das nicht dauerhaft so sein. Fehler sollten in irgendeiner Form behandelt werden, zumindestens geloggt werden und bei Usereingaben eine Fehlermeldung ausgegeben werden.
 
Oben