Kann mich nicht über jdbc mit mit einer mysql db verbinden

  • Antworten:1
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 1

23.08.2019, 10:55:19 via Website

Hey,
ich bin ziemlicher Anfänger. Momentan versuche ich eine App zu bauen, die auf eine mysql Datenbank zugreifen soll. Ich habe den connector/j in Android Studio implementiert (Modul hinzufügen --> .jar datei ausgewählt --> moduleinstellungen geöffnet --> dependencys --> jdbc coonector bei declared dependencys hinzugefügt )
Ich benutze eine mysql datenbank der Version 5.7.26 und den jdbc connector 5.1.45.
Die db habe ich mit dem user surftest erstellt.
Wenn ich jetzt versuche mich mit der Datenbank zu verbinden bekomme ich folgenden Fehler ausgegeben:

W/System.err: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.
    W/System.err:     at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.Util.getInstance(Util.java:408)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887)
    W/System.err:     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2265)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2014)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:776)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330)
    at java.sql.DriverManager.getConnection(DriverManager.java:569)
    at java.sql.DriverManager.getConnection(DriverManager.java:191)
    at com.example.surfrenttest.MainActivity.onCreate(MainActivity.kt:27)
    at android.app.Activity.performCreate(Activity.java:7455)
    W/System.err:     at android.app.Activity.performCreate(Activity.java:7445)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1286)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3343)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3548)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:86)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2155)
    at android.os.Handler.dispatchMessage(Handler.java:109)
    at android.os.Looper.loop(Looper.java:207)
    at android.app.ActivityThread.main(ActivityThread.java:7539)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
    W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:958)
Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1523)
    at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:117)
    W/System.err:     at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:105)
    at java.net.InetAddress.getAllByName(InetAddress.java:1154)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:188)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:300)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2187)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2219)
    ... 26 more

Mein code sieht so aus:

package com.example.surfrenttest

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import java.lang.Exception
import java.sql.*
import java.util.*

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    var connection: Connection? = null
    var username = "surftest"
    var password = "surftest"

    val connectionProps = Properties()
    connectionProps.put("user", username)
    connectionProps.put("password", password)

    try {
        // load and register JDBC driver for MySQL
        Class.forName("com.mysql.jdbc.Driver");
        connection = DriverManager.getConnection(
            "jdbc:" + "mysql" + "://" +
                    "localhost" +
                    ":" + "3306" + "/surftest" +
                    "",
            connectionProps)
    } catch (ex: SQLException) {
        // handle any errors
        ex.printStackTrace()
    } catch (ex: Exception) {
        // handle any errors
        ex.printStackTrace()
    }

}

}

Ich habe schon versucht selber nach dem Fehler zu suchen, komme aber nicht weiter. Hat jmd von euch ne idee?
Vielen Dank im vorraus :)
Slarti

Edit:
Ich arbeite mit der db auf meinem Laptop mit ubuntu und teste auf einem externen Tablet. Habe auch schon versucht über die ip meines wlan interfaces zu verbinden, dass hat aber auch nicht geklappt.

— geändert am 23.08.2019, 10:59:17

Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.548

23.08.2019, 11:28:38 via Website

Hallo Slarti,

im vorhinein: Solange du das SQL bei dir intern nutzt kannst du die Konstruktion theoretisch so lassen.
Solltest du aber vorhaben, das ganze später mal übers Internet laufen zu lassen, sperren die meisten WebHoster MySql nach außen und zum anderen ist das Sicherheitstechnisch bedenklich, weil dann deine DB "unverschlüsselt" im Internet hängt und mindestens jeder der die App hat, sich auch ohne App zugriff auf Daten verschaffen kann.


Das Problem hier ist, dass die MySql Connector Libs nicht für Android gedacht sind, d.h. sie verbinden sich direkt mit dem Server und das geht in Android nicht, da jegliche Netzwerkkommunikation über Threads oder AsyncTasks laufen muss.
Somit wirst du nicht drumrum kommen, dir einen Thread oder AsyncTask zu schreiben, welcher auf die DB zugreift. Das siehst du an der Exception :Caused by: android.os.NetworkOnMainThreadException

Zudem gibt du in deinem ConnectionString einen "localhost" an. Da ich annehme, dass die DB auf deinem Ubuntu läuft, müsste da die IP des passenden Datenbankserver stehen, also die von deinem Ubuntu.
Zudem musst du Sicherstellen dass deine DB auch über die IP und Port erreichbar ist und nicht nur über den Localhost. Ansonsten kann die Verbindung nicht funktionieren.

Je nach einsatzzweck empfehle ich dir, das nutzen von WebApis z.b. in PHP welche Parameter entgegen nehmen, ensprechende DB abfragen machen und die Daten dann z.b. als JSON zurückgeben.
Die App muss sich dann mit der DB nicht mehr ausseinandersetzen sondern nur noch das Json Parsten (am besten in Objekcte via Gson) und evtl. Daten anzeigen.

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

Hilfreich?
Diskutiere mit!