MySQL Datenbankverbindung scheitert

dan1337

Neues Mitglied
Hi,

ich hab schon seit Längerem nichts mehr programmiert, aber jetzt wieder Lust bekommen etwas zu schreiben. =)
Als Einstiegsprojekt habe ich ein Programm gewählt, welches Daten von Textfeldern einließt und in eine MySQL-Datenbank schreibt.
Es handelt sich hierbei um ein Java-Applet, da ich es auf meinem Webserver meinen Freunden zur Verfügung stellen will. Das Programm ließt Handynummer, E-Mail, Homenummer und Name ein.

Ich habe ein PC, auf welchem ich das Ganze programmiere. Ich benutze hierbei NetBeans 6.8.
Auf diesem PC habe ich zusätzlich in VMware eine XP-VM laufen.
Hier habe ich den Xampp installiert. (Apachee und MySQL)
Dieser dient also als mein Webserver.

Durch KabelBW habe ich fast eine statische IP. (Wechselt max. 1 mal im Monat)

Netzwerktechnisch und Datenbanktechnisch alles kein Problem.
Nur scheitere ich an der Datenbankverbindung.

Wenn ich das Applet aus NetBeans heraus starte, kann ich eine Datenbankverbindung aufbauen!
-Keine Fehler und der dafür angelegt Benutzer wird auf dem MySQL Server als aktiv angezeigt.

Wenn ich allerdings das Applet via html-Datei starte bekomme ich einen Fehler:

Code:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2103)
	at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:718)
	at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
	at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at Crawli.init(Crawli.java:43)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Caused by: java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission 95.208.77.XXX:3306 connect,resolve)
	at com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:404)
	at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:265)
	at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:280)
	at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2026)
	... 14 more
Meine öffentliche IP: 95.208.77.XXX ; Im Programm habe ich natürlich die Richtige verwendet 😉


Ausschnitt aus Quelltext:
Java:
import java.io.*;
import java.sql.*;

public class Crawli extends javax.swing.JApplet {

String Daten[] = new String[6];

Connection con = null;
Statement stmt = null;
ResultSet rs = null;
    
    /** Initializes the applet Crawli */
    
    @Override
    public void init()  {
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                public void run() {
                    initComponents();
                }
            });
        } catch (Exception ex) {
            ex.printStackTrace();
           }


           try{ Class.forName("com.mysql.jdbc.Driver");
           }
           catch (Exception a){
               a.printStackTrace();
            TFname.setText("Treiber nicht erfolgreich eingebunden");

           }
      
           try {
           con = DriverManager.getConnection(
             "jdbc:mysql://95.208.77.xxx:3306/datensammlung", "raat", "est1337");
            }
            catch (SQLException e){
            e.printStackTrace();
            TFvorname.setText("Datenbankverbindung nicht erfolgreich");
            return;
            }

    }

Er springt bei der SQLException e heraus, da ich "Datenbankverbindung nicht erfolgreich" angezeigt bekomme.


Ach ja, HIIIIIIIIIIIIIIIIIIILFE ???:L

Ich wäre SEHR dankbar, wenn mir jemand weiterhelfen könnte :toll:
 
Hallo Leute,

ich habe heute leider das selbe Problem.
Damit ich nicht unnötig einen neuen Thread öffne, poste ich hier.

Folgende Situation:
Ich möchte genauso wie dan1337 ein Applet, dass eine Verbindung mit einer Datenbank erstellt, Daten ausliest und später dann evt. Einträge vornimmt.

Ich habe eine erfolgreiche Verbindung mit dem localhost im Programm selbst (ich benutze JavaEditor v9.1.4). Sobald ich aber das HTML außerhalb starte, also z.B. FF, bekomme ich nach dem druck auf meinen Button nichts zu sehen... Erst in der Java-Konsole erhalte ich lediglich eine einzige Meldung:
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.
Ich habe beim signieren folgende Dateien im Quellcode der Bat eingefügt: "Neobux.jar manifest.mf mysql-connector-java-5.1.16-bin Neobux.class"
Ich hoffe das ist der richtige Weg beide Dinge zu signieren (Applet + Treiber).

Folglich nach dem signieren ein Start: Java fragt nach, ob ich das Applet ausführen möchte. Drücke ich auf meinen Start Button kommt ungefähr die Meldung: "Ausführen der potentiell gefährlichen Aktion blockieren?", die ich mit Nein beantworte...
Es folgt die selbe Meldung von oben wieder...

Ich hab bereits viele Themen hier und in google durchforstet, allerdings konnte ich keine Antwort auf das bestehende Problem finden.
Was kann hier noch der Fehler sein? Ich möchte das Applet später auf meinen Homeserver (Windows Server 2003) stellen um dann z.B. von einem anderen Computer darauf zugreifen zu können und einen Eintrag in der DB zu machen. Ist das prinzipiell überhaupt möglich?
MYSQL läuft, das sogenannte "skip-networking" ist mit # auskommentiert
Auf die DB kann man von außen zugreifen
Port 3306 ist am Router frei bzw. Port-Forwarded
Firewall blockiert ebenfalls nicht.
Allerdings bringen mir die Einstellungen alle nichts, wenn ich nicht einmal übern localhost drauf komme?...

Habe das Applet mit 127.0.0.1, sowohl als auch mit "localhost" durchprobiert...
Hier mein Code:
Java:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;


public class Neobux extends Applet implements ActionListener {

    String driver   = "org.gjt.mm.mysql.Driver";
    String url      = "jdbc:mysql://127.0.0.1/test2";
    String user     = "root";
    String password = "toor";

Button but;
TextField inconsole;
TextArea console, console2;

public void init() {
       resize(1100,700);
       setBackground(new Color(100,100,100));
       //Button
       but = new Button("Start");
       but.addActionListener(this);
       add(but);
       console = new TextArea("");
       console.setBackground(Color.BLACK);
       console.setForeground(Color.LIGHT_GRAY);
       console.setEditable(false);
       add(console);
       console2 = new TextArea("");
       console2.setBackground(Color.BLACK);
       console2.setForeground(Color.LIGHT_GRAY);
       console2.setEditable(false);
       add(console2);
       inconsole = new TextField("");
       add(inconsole);
}//Ende init

public void paint(Graphics g) {
           console.setBounds(120,250,300,200);
           console2.setBounds(520,250,300,200);
           inconsole.setBounds(120,480,300,20);
            //Button
           but.setBounds(400,200,100,50);
           g.setColor(Color.DARK_GRAY);
           g.fillRect(170,70,500,100);
           g.setColor(Color.WHITE);
           g.drawRect(1,1,1000,500);
}//Ende paint

public void actionPerformed(ActionEvent ae){
            Object wer = ae.getSource();
            if (wer==but) {
               try {
                   // Treiber laden
                   Class.forName(driver);
                   }//Ende Try
               catch(Exception e) {
               System.err.println(e.getMessage());
               System.exit(0);
               }//Ende catch

    Connection connection = null;
    Statement statement = null;

              try {
                  // Verbindung zur DB
                  connection = DriverManager.getConnection(url, user, password);
                  statement = connection.createStatement();
                  String query = inconsole.getText();
                  // Daten holen
                  ResultSet result = statement.executeQuery(query);
                  if(result!=null) {
                     // Spaltenüberschriften ausgeben
                     ResultSetMetaData rsmd = result.getMetaData();
                     for(int i=1; i<=rsmd.getColumnCount(); i++) {
                          System.out.print(rsmd.getColumnName(i));
                          console.append(String.valueOf(rsmd.getColumnName(i))+"\n");
                          System.out.print((char)9);
                     }//Ende for
                     System.out.println();
                     // Abfrageergebnisse ausgeben
                     result.beforeFirst();
                     while(result.next()) {
                           for(int column=1; column<=rsmd.getColumnCount(); column++) {
                           System.out.print(result.getObject(column));
                           console2.append(String.valueOf(result.getObject(column))+"\n");
                           System.out.print((char)9);
                           }//Ende for
                           System.out.println();
                     }//Ende while
                     result.close();
                  }//Ende if
    }//Ende try
    catch(SQLException e) {
      System.err.println(e.getMessage());
    }//Ende catch
    finally {
      if(statement!=null) {
        try { statement.close();} catch(Exception e) {}
      }//Ende if
      if(connection!=null) {
        try { connection.close();} catch(Exception e) {}
      }//Ende if
    }//Ende finally
            }//Ende if
}//Ende actionPerformed
}//Ende class

Ich hoffe es kann mir jemand helfen 🙂

*Edit:
Habe das signierte File auf den Server kopiert.
#1 Manuell über den Pfad funktioniert es nicht.
#2 Rufe ich es aber über die locale Webadresse auf, funktioniert es
#3 Rufe ich es über einen anderen Computer übers Net auf, funktioniert es nicht.
#4 Ändere ich die IP von (127.0.0.1 oder localhost) auf die öffentliche es Servers, oder die lokale im Netzwerk, und starte es im Programm, funktioniert es ebenfalls nicht. Allerdings bekomme ich hier folgenden Fehler:
null, message from server: "Host 'TOWER' is not allowed to connect to this MySQL server"
#5 Nachdem ich die IP auf die öffentliche IP des Servers geändert habe, die ganze Prozedur der signierung ebenfalls erledigt habe, bekomme ich nun die Meldung:
Could not create connection to database server.
Am Server: Nur in Firefox öffnen oder über http://localhost/...Neobux.html kommt auf das selbe raus mit der vorherigen Meldung.
Gehe ich über http://ServerIP/.../Neobux.html erhalte ich: "null, message from server: "Host '85-127-xxx-xxx.dynamic.xdsl-line.inode.at' is not allowed to connect to this MySQL server"
"
 
Zuletzt bearbeitet:
Soo, nach sehr langer tüftelei bin ich doch noch selbst zur Lösung gekommen.
An folgendem hat es gelegen:

Damit man sich mit root, oder jedem anderen benutzernamen einloggen kann, muss dieser klarerweise ersteinmal in mysql/phpmyadmin definiert sein!!!

Somit musste ich mich auf meinem Server in phpmyadmin einloggen. Dort findet man den Reiter: Rechte.
Man findet eine Tabelle mit bereits vordefinierten Usern.
z.B.
Benutzer: root; Host: localhost; Passowort: Ja; Globale Rechte: ALL PRIVILEGES; Grant: Ja
damit hab ich mir einen neuen User erstellt:
Benutzer: Appletuser; Host: %; Passowort: Ja; Globale Rechte: ---; Grant: Ja/Nein

Tada, ich schreibe mein Applet um, logge mich somit mit Appletuser und PW ein. Der Host dabei ist sozusagen ALLES/von Überall...
Nocheinmal signieren, upload auf Server -> schon kann ich mit der webadresse von jedem PC aus darauf zugreifen.

Hoffe, dass es vielleicht jemanden weiterhilft 😉

Wie kann ich nun etwas in die Datenbank eintragen? Mit welcher Methode, Funktion geht das?

Schöne Grüße,
KniFFeL
 
Zuletzt bearbeitet:
Ich spreche nicht von MySQL sondern Java. Mit welcher Methode/Funktion kann ich ihm den SQL Befehl senden? Wie man etwas abfragt oder in die DB mit MySQL einträgt ist kein Problem.
Allerdings ist das das Problem:
INSERT INTO ...
Can not issue data manipulation statements with executeQuery().
---------------
SELECT * FROM ...
funktioniert einwandfrei.
 
Danke dir maki,
hat mit
Java:
statement.executeUpdate("insert into daten (nr,datum,preis,sonstiges) values(4,'2011-05-05',1,4);");
funktioniert. 😀
 

Zurück
Oben