• 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!

Erledigt MySQL Tabelle wird nicht erstellt :/

Yasuo Krieger

Kuhfänger
Mitglied seit
22 November 2015
Beiträge
59
Minecraft
NonPrimeYasuo
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 ;(
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
Da du in die Catch-Blöcke in connect(), update() und getResult() nichts reingeschrieben hast, wird bei Problemen auch keine Fehlermeldung ausgegeben. Somit passiert einfach garnichts und man weiß auch nicht, woran es liegt. Daher ist es wichtig, eventuelle Exceptions und deren Stacktrace zu protokollieren, dann kannst du über die Serverkonsole das Problem und die zugehörige Codezeile herausfinden. In Bukkit gibt es bereits ein Logging-System, also reicht es, folgendes in die Catch-Blöcke zu schreiben:
Java:
Bukkit.getLogger().log(Level.SEVERE, "Ein Datenbankfehler ist aufgetreten", e);
Dabei weist SEVERE den Eintrag als Fehler aus, der zweite Parameter ist eine benutzerdefinierte Meldung und als drittes wird der Methode die entstandene Throwable, in diesem Fall die SQLException, übergeben.
 

HansDev

Schafhirte
Mitglied seit
27 September 2018
Beiträge
113
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
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
@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.
 

JOO200

Vorarbeiter
Osterei Experte
Mitglied seit
18 Dezember 2016
Beiträge
254
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.
 

Yasuo Krieger

Kuhfänger
Mitglied seit
22 November 2015
Beiträge
59
Minecraft
NonPrimeYasuo
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
 

❤️可愛いちゃん️❤️

Threadripper
Osterei Experte
Mitglied seit
19 Mai 2014
Beiträge
1.237
Alter
2
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.
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
114
Alter
21
Minecraft
LapisMC
Es ist eigentlich egal ob man einen wert hinterlegt und auch den char vom UUID ist egal. Das hat damit nichts zu tun
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.

Und beim nächsten Mal bitte die Fehler richtig behandeln. Ein leerer Catch Block ist immer falsch,
Das hatte ich auch oben schon erwähnt. Zumindest sollte der Fehler ausgegeben werden (gerade während der Entwicklung, weil man die tatsächliche Ursache des Problems sonst nur erraten kann).
 

JOO200

Vorarbeiter
Osterei Experte
Mitglied seit
18 Dezember 2016
Beiträge
254
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.
 

Yasuo Krieger

Kuhfänger
Mitglied seit
22 November 2015
Beiträge
59
Minecraft
NonPrimeYasuo
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

Vorarbeiter
Osterei Experte
Mitglied seit
18 Dezember 2016
Beiträge
254
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.
 

Twitter

Allgemein
Hilfe Benutzer
    Kroseida Kroseida: und bist für die Wirtschaft zu gebrauchen xD
    Oben