MySQL will nicht

Dieses Thema im Forum "Programmierung" wurde erstellt von Kombustor, 25. Juli 2013.

  1. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Hallo,

    ich nutze folgende Klassen für die SQL-Verbindung:
    https://forums.bukkit.org/threads/tutorial-using-mysql-in-your-plugins.132309/

    Nun möchte ich das beim joinen der Wert in MySQL auf 0 gesetzt wird:
    Code (Text):
    1.  
    2. [MENTION=109443]Event[/MENTION]Handler
    3.     public void onJoin(PlayerJoinEvent event) {
    4.         Player p = event.getPlayer();
    5.         try {
    6.             Statement statement = c.createStatement();
    7.             ResultSet res;
    8.             res = statement
    9.                     .executeQuery("SELECT Points FROM Points WHERE Player = '"
    10.                             + p.getName() + "';");
    11.             res.next();
    12.             if (res.getString("Player") == null) {
    13.                 statement
    14.                         .executeUpdate("INSERT INTO Points (`Player`, `Points`) VALUES ('"
    15.                                 + p.getName() + "','0');");
    16.             }
    17.         } catch (SQLException e) {
    18.             logger.severe(e.getMessage());
    19.         }
    20.     }
    21.  
    Die Connection c wird wie folgt aufgerufen:

    In der Klasse
    Code (Text):
    1.  
    2.         String host;
    3.     String database;
    4.     String port;
    5.     String user;
    6.     String pass;
    7.     public MySQL MySQL;
    8.     Connection c = null;
    9.  
    im onEnable Teil:

    Code (Text):
    1.  
    2.                 host = getConfig().getString("MySQL.host");
    3.         database = getConfig().getString("MySQL.database");
    4.         port = getConfig().getString("MySQL.port");
    5.         user = getConfig().getString("MySQL.user");
    6.         pass = getConfig().getString("MySQL.pass");
    7.  
    8.         MySQL = new MySQL(host, port, database, user, pass);
    9.  
    10.         c = MySQL.open();
    11.  

    Jedoch bekomme ich zwei fehler, der zweite resultiert wohl aus dem ersten:

    Fehler 1:
    Code (Text):
    1.  
    2. Could not connect to MySQL server! because: Communications link failure
    3.  
    4. The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    5.  
    Fehler 2:
    Code (Text):
    1.  
    2. 2013-07-25 15:38:32 [SEVERE] Could not pass event PlayerJoinEvent to PunkteSystem v1.0
    3. org.bukkit.event.EventException
    4.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:427)
    5.     at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62)
    6.     at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:477)
    7.     at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:462)
    8.     at net.minecraft.server.v1_6_R2.PlayerList.c(PlayerList.java:206)
    9.     at net.minecraft.server.v1_6_R2.PlayerList.a(PlayerList.java:102)
    10.     at net.minecraft.server.v1_6_R2.PendingConnection.e(PendingConnection.java:130)
    11.     at net.minecraft.server.v1_6_R2.PendingConnection.d(PendingConnection.java:43)
    12.     at net.minecraft.server.v1_6_R2.DedicatedServerConnectionThread.a(DedicatedServerConnectionThread.java:41)
    13.     at net.minecraft.server.v1_6_R2.DedicatedServerConnection.b(SourceFile:29)
    14.     at net.minecraft.server.v1_6_R2.MinecraftServer.t(MinecraftServer.java:590)
    15.     at net.minecraft.server.v1_6_R2.DedicatedServer.t(DedicatedServer.java:226)
    16.     at net.minecraft.server.v1_6_R2.MinecraftServer.s(MinecraftServer.java:486)
    17.     at net.minecraft.server.v1_6_R2.MinecraftServer.run(MinecraftServer.java:419)
    18.     at net.minecraft.server.v1_6_R2.ThreadServerApplication.run(SourceFile:582)
    19. Caused by: java.lang.NullPointerException
    20.     at me.kombustorlp.punktesystem.PunkteSystem.onJoin(PunkteSystem.java:159)
    21.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    22.     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    23.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    24.     at java.lang.reflect.Method.invoke(Unknown Source)
    25.     at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:425)
    26.     ... 14 more
    27.  
    ich hoffe ihr könnt mir helfen

    Grüße Fabian
     
    #1
  2. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Lass dir diese Variablen mal in die Konsole ausgeben und schick uns das Ergebnis.

    MySQL = new MySQL(host, port, database, user, pass);

    In Zeile PunkteSystem.java:159 ist eine Variable nicht gesetzt.
     
    #2
  3. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55

    Wie meinst du ausgeben?

    Die "nicht gesetzte variable in Z. 159 ist":
    Statement statement = c.createStatement();

    -.-
     
    #3
  4. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Dann ist c null.

    Mit ausgeben meine ich, dass du dir die Variablen in er Konsole anzeigen lässt. Davon hätte nämlich auch eine null sein können.
     
    #4
  5. games6471
    Online

    games6471

    Ein NPE (NullPointerException) entsteht sobald man auf ein nicht existierendes Objekt zugreift (null).

    Also müsste deine Variable "c" null sein.
     
    #5
  6. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Genau, c ist aber nicht null :/, siehe onEnable:
    Code (Text):
    1.  
    2.     public void onEnable() {
    3.         getServer().getPluginManager().registerEvents(this, this);
    4.  
    5.         addDefaults();
    6.  
    7.         host = getConfig().getString("MySQL.host");
    8.         database = getConfig().getString("MySQL.database");
    9.         port = getConfig().getString("MySQL.port");
    10.         user = getConfig().getString("MySQL.user");
    11.         pass = getConfig().getString("MySQL.pass");
    12.  
    13.         MySQL = new MySQL(host, port, database, user, pass);
    14.  
    15.  
    16.         [B]c = MySQL.open();[/B]
    17.     }
    18.  
    der Entwickler dieses MySQL-Systems sagt dazu:

    P.S : If you're having problems getting a NullPointer when calling
    Code:java

    Statement statement = c.createStatement();


    Try putting
    Code:java

    Statement s = MySQL.open().createStatement();

    before trying to make the statement.


    Kommt trotzdem eine NPE.
     
    #6
  7. Chrisliebaer
    Online

    Chrisliebaer

    Wieso sollte c nicht null sein können? Les dir bitte mal die Dokumentationen durch, ich Wette zu 100%, dass open() im Fehlerfall null zurück gibt.

    Außerdem könntest du ja auch mal nen Debugger verwenden oder dir die Variablen ausgeben lassen.


    Des weiteren sieht das ganze "Tutorial" sehr billig aus. Wenn du MySQL brauchst, dann nimm doch einfach die JDBC Treiber dafür.
     
    #7
  8. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Wahrscheinlich sind Werte der config falsch, weshalb die Funktion null zurückgibt.

    Alles kann null sein, denn auch eine Funktion kann null zurückgeben. Da du eine dir unbekannte Funktion aufrufst, kannst du dir überhaupt nicht sicher sein, dass dort nicht null zurückkommt.

    Eine einfache Ausgabe der Variable würde genügen um festzustellen, ob eine Variable null ist und dem Fehler somit einzugrenzen. Wobei die Fehlermeldung in einer Zeile auftritt, wo nur eine Anweisung drin steht, also ist klar, was null sein muss.
     
    #8
  9. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Eigentlich sollte dieses Tutorial doch meinen Anforderungen genügen oder?
    http://forums.bukkit.org/threads/tu...ur-plugins-mysql-databases.43445/#post-845211
     
    #9
  10. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Kannst du nicht einfach mal das machen, worum man dich bittet?

    Im echten Leben suchst du doch auch selbst nach den Ursachen für deine Probleme oder schiebst du es auf die IKEA-Anleitung, wenn irgendwas nicht so funktioniert wie erwartet?

    Und wenn dann herauskommt, dass es eine so offensichtliche Blödheit ist, wie ungültige Verbindungsdaten für die Datenbank zu übergeben, wird das nicht in der Dokumentation stehen. Deshalb musst du versuchen nachzuvollziehen, was DU in DEINEM Code falsch gemacht haben könntest.

    NACHDEM du Fehler auf deiner Seite ausschließen kannst, solltest du den Code der API anschauen oder einfach mal versuchen, eine Exception abzufangen.
     
    #10
  11. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Hi geckocraft,

    Ich finde es nicht fair mich als blöd darzustellen, aber nun gut...

    So, ich habe die ganze API nun rausgehauen, und nutze JDBC wie folgt:

    Code (Text):
    1.  
    2.     public String user;
    3.     public String pass;
    4.     public String url;
    5.  
    6.     public void onEnable() {
    7.         getServer().getPluginManager().registerEvents(this, this);
    8.  
    9.         addDefaults();
    10.        
    11.        
    12.         String database = getConfig().getString("MySQL.database");
    13.         Integer port = getConfig().getInt("MySQL.port");
    14.         String host = getConfig().getString("MySQL.host");
    15.        
    16.  
    17.        
    18.         user = getConfig().getString("MySQL.user");
    19.         pass = getConfig().getString("MySQL.pass");
    20.        
    21.         url = "jdbc:mysql://"+host+":"+port+"/"+database;
    22.     }
    23.  
    24.  
    Und dann:

    Code (Text):
    1.  
    2.                       Connection conn = DriverManager.getConnection(url, user, pass);
    3.                         Statement statement = conn.createStatement();
    4.                         ResultSet res = statement
    5.                                 .executeQuery("SELECT Points FROM Points WHERE Player = '"
    6.                                         + pl.getName() + "';");
    7.                         res.next();
    8.  
    usw...

    Nun keine NullPointer-Exception mehr, jedoch immer noch:
    2013-07-25 17:26:21 [SEVERE] Communications link failure

    The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.


    Aber der MySQL - Server ist online, die Zugangsdaten stimmen auch :/
    Kann es sein das eine externe Verbindung durch die Firewall geblockt wird? Ich probiere das System gerade lokal aus!

    Grüße Fabian
     
    #11
  12. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Hi,

    also ich möchte dich nicht als blöd darstellen.. nur als ignorant. Ich möchte nur, dass du weißt, dass es häufiger die Dummheit desjenigen ist, der nicht mit einem Produkt klar kommt, als die des Produktherstellers.

    Nach wie vor würde ich empfehlen, zur Sicherheit einfach mal den ConnectionString auszugeben: url
    Für mich ist nicht garantiert, dass dort irgendwelche vernünftigen Werte drin stehen.

    Natürlich kann es auch daran liegen, dass die Datenbank nicht erreichbar ist.

    Auch mal 127.0.0.1 statt localhost versuchen.

    /edit
    Der letzte Satz ist natürlich Unsinn, wenn du auf eine externe DB zugreifen willst. Du könntest aber zum Spaß mal eine lokale einrichten und schauen, ob dein Plugin dort funktioniert. Dann weißt du, dass es an der Verbindung oder Fehlkonfiguration der externen Datenbank liegt. Es kann ja auch sein, dass die Datenbank keine Zugriffe externer Adressen erlaubt.
     
    #12
  13. Kombustor
    Offline

    Kombustor

    Registriert seit:
    1. Februar 2013
    Beiträge:
    55
    Ich nutze eine externe Datenbank, bei 000webhost.com gehosted, ist also in dem Fall der MySQL-Server mysql6.000webhost.com

    Sonst passt auch alles, trotzdem wird keine Verbindung hergestellt, warum? :eek:
    Grüße Fabian
     
    #13
  14. Baba43
    Online

    Baba43 Ehem. Teammitglied

    Registriert seit:
    5. November 2012
    Beiträge:
    590
    Hab gerade was editiert. Leider zu spät, sorry.
     
    #14
  15. Ein weiterer Ansatz wäre es mal, dass du die Verbindung überprüfst, indem du ein unabhängiges Programm auf dem Client benutzt.
     
    #15