Problem bei MySQL Connection - java.sql.SQLException: Unable to connect to any hosts due to exception

  • Antworten:6
  • Bentwortet
Henrik Martens
  • Forum-Beiträge: 607

31.12.2015, 15:23:06 via Website

Hallo Leute,

ich habe mal wieder ein Problem, finde aber keine Lösung.

Ich versuche mit JDBC auf eine MySQL Datenbank zu kommen. Die entsprechende Lib ist importiert und wird geladen. Hier mein Quellcode:

import android.widget.Toast;

import java.util.ArrayList;
import java.sql.*;
import java.util.Calendar;

/**
 * Created by Henrik on 27.12.2015.
 */
public class MySQLHandler {

    public static final String server = "aintlarry.lima-db.de";
    public static final String port = "3306";
    public static final String username = "**********";
    public static final String password = "********";
    public static final String dbName = "db_338853_1";

    static Connection connection = null;

    MainActivity Ma;

    public static void main(String[] args){
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();;
        }
        catch (Exception e) {
        }
    }

    public String makeTableName(){

        String tableName = "";

        Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        tableName = "" + year + month + day;

        return tableName;

    }

    public void startNewEvent(ArrayList<Player> players) {

        String tableName = makeTableName();

        try {
            String url = "jdbc:mysql://"+server+":"+port+"/"+dbName;
            connection = DriverManager.getConnection(url, username, password);

            if(doTableExists(tableName) == false){

                String hName = "Henrik";
                int hMoney = 0;
                int hTip = 0;

                Statement statementH = connection.createStatement();
                String sqlCommand = "CREATE TABLE '" + tableName + "'";
                statementH.executeUpdate(sqlCommand);

                for (Player p : players) {
                    String pName = p.getName();
                    int pMoney = p.getMoney();
                    int pTip = p.getTip();
                }

                connection.close();

            }else {
                Toast.makeText(Ma.getApplicationContext(), "Der heutige Wettbewerb wurde bereits erstellt!", Toast.LENGTH_LONG).show();
            }
        }

        catch (SQLException sqle) {
            sqle.printStackTrace();
        }

    }

    public boolean doTableExists(String tbName){
        boolean b = false;

        try {
            String url = "jdbc:mysql://"+server+":"+port+"/"+dbName;
            connection = DriverManager.getConnection(url, username, password);

            Statement statement = connection.createStatement();
            String sqlCommand = "SHOW TABLES LIKE '" + tbName + "'";
            ResultSet rs = statement.executeQuery(sqlCommand);

            if(rs.getRow() == 0){
                b = false;
            }else{
                b = true;
            }

            connection.close();

        } catch (SQLException sqle) {

        }

        return b;
    }

}

Das hier ist die Fehlermeldung:

12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: java.sql.SQLException: Unable to connect to any hosts due to exception: android.os.NetworkOnMainThreadException
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: ** BEGIN NESTED EXCEPTION ** 
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: android.os.NetworkOnMainThreadException
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: STACKTRACE:
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: android.os.NetworkOnMainThreadException
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.net.InetAddress.getAllByName(InetAddress.java:215)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:125)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:225)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.Connection.createNewIO(Connection.java:1805)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.Connection.<init>(Connection.java:452)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:179)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:213)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.MySQLHandler.startNewEvent(MySQLHandler.java:55)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.AddEventActivity.startEvent(AddEventActivity.java:86)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.AddEventActivity$2.onClick(AddEventActivity.java:59)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.view.View.performClick(View.java:5226)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.view.View$PerformClick.run(View.java:21266)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Looper.loop(Looper.java:168)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5781)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err: ** END NESTED EXCEPTION **
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.Connection.createNewIO(Connection.java:1875)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.Connection.<init>(Connection.java:452)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:411)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:179)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at java.sql.DriverManager.getConnection(DriverManager.java:213)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.MySQLHandler.startNewEvent(MySQLHandler.java:55)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.AddEventActivity.startEvent(AddEventActivity.java:86)
12-31 15:06:48.524 32314-32314/de.aintlarry.patsch W/System.err:     at de.aintlarry.patsch.AddEventActivity$2.onClick(AddEventActivity.java:59)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.view.View.performClick(View.java:5226)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.view.View$PerformClick.run(View.java:21266)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.os.Looper.loop(Looper.java:168)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5781)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
12-31 15:06:48.525 32314-32314/de.aintlarry.patsch W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687

Fällt euch auf Anhieb auf, warum keine Verbindung hergestellt werden kann?

Henrik

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.12.2015, 15:28:07 via Website

Es kann keine Verbindung hergestellt werden, da

NetworkOnMainThreadException

Du darfst netzwerk/Internet Sachen in Android nicht im MainThread machen.
Benutze einen AsyncTast oder einen nomalen Thread dafür.

Zudem sollte man sich nie direkt mit der MySql DB verbinden, sondern über eine PHP o.ä. API gehen.
Dann musst du in der App nur eine Url mit den passenden Parametern aufrufen, und das PHP macht dir dann die entsprechnenden DB Operationen.

PS: Erlaubt dir dein Webhoster überhaupt externen Zugriff auf MySql?
Normalerweise ist das nur lokal (über PHPMyAdmin/ oder über Skripte verfügbar)

— geändert am 31.12.2015, 15:28:40

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

31.12.2015, 15:34:03 via Website

Ah okey, dass werde ich gleich mal ändern, eventuell hilft das ja schon.

Habe ich auch schon überlegt, aber den Aufwand möchte ich nicht betreiben, da es sich nur um eine kleine Spaß-App für mich und zwei Freunde handelt.

Ja der externe Zugriff ist erlaubt.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.12.2015, 15:35:38 via Website

Solange du sicherstellst, dass sich die App nicht weiter verbreitet geht das noch.
Ansonsten kann ganz leich jemand dein MySQL Passwort auslesen, und wer weiss was damit machen.

— geändert am 31.12.2015, 15:35:53

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

31.12.2015, 15:49:18 via Website

Das ist hier kein Problem, wie gesagt nur eine kleine Spielerei...

Ich habe nun eine andere Frage... Wie übergebe ich dem AsyncTask bzw. der doInBackground denn mein Player-Objekt?
normalerweise übergibt man der Methode ja Strings

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

31.12.2015, 15:53:07 via Website

Ne kannst da auch ein Object[] Array übergeben, du musst dann halt über die Positionen wieder in die passenden Typen casten

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Henrik Martens
  • Forum-Beiträge: 607

03.01.2016, 20:52:21 via Website

Hallo Pascal,

danke für deine Hilfe, ich habe das mal eben umgesetzt. Es funktioniert wunderbar.

Einfach die SQL-Sachen in einen AsyncTask gepackt. Läuft.

Danke

Henrik

Antworten