MySQL Verbdinung kommt nicht zu stande

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • MySQL Verbdinung kommt nicht zu stande

    Hallo zusammen

    Da bin ich wieder. Ich hoffe dieses mal liegt es nicht nur an der Schreibweise xD

    Ich will mein App mit meinem MySQL Server im Netzwerk verbinden.
    Es ist eine MySQL Datenbank welche auf meinem Synology NAS läuft. Die Datenbank ist erstellt und mit einem, aus dem I-Net gefischten Tool, auch auf erreichbarkeit geprüft worden.
    Die Firewall auf meinem Computer ist deaktiviert und das emulierte Andorid L von Android Studio hat auch Internet (Mit dem Browser kann ich Google aufrufen)

    Mir ist bewusst, das ich wegen der Sicherheit über ein php Script gehen sollte. (Habe die anderen Thread zum SQL Server hier gelesen, nebst gefühlten 10 Millionen anderen Threads im Internet zu diesem Thema :)), aber die App wird ausschliesslich für mich laufen, von dem her ist es nicht so wichtig :) Zudem sind es keine sesiblen Daten und wenn sie jemand löschen sollte, ist es mir auch egal.


    Ich will vorerst nicht mal etwas auslesen, ich will nur eine Verbidnung aufbauen, aber nichtmal das klappt :(

    Code:

    Java-Quellcode

    1. package com.example.blackrider.easyvoci;
    2. import java.sql.Connection;
    3. import java.sql.DriverManager;
    4. import java.sql.ResultSet;
    5. import java.sql.Statement;
    6. public class c_MySQL
    7. {
    8. Statement transmission;
    9. ResultSet leResultat;
    10. public void Connect()
    11. {
    12. try
    13. {
    14. Class.forName("com.mysql.jdbc.Driver");
    15. Connection cn = DriverManager.getConnection("jdbc:mysql://******:****/MyDB", "root", "*****");
    16. transmission = cn.createStatement();
    17. leResultat= transmission.executeQuery("select * from User");
    18. }
    19. catch (Exception ex)
    20. {
    21. String error = ex.getMessage();
    22. }
    23. }
    24. }
    Alles anzeigen


    Fehlermeldung:
    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.




    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    Habe ich auch in die Mainifext geschrieben. Benutzt wird JDBC v. 5.1.31.

    Aktuelles Snippet habe ich von hier:
    stackoverflow.com/questions/11…ection-with-drivermanager
    Und bei dem scheint es ja nach dem richtigen setzen der Rechte zu funktionieren, aus diesem Grund gehe ich auch absichtlich mit root drauf (Testweise), da sollte ich auch alle Rechte haben.

    Was kann da falsch sein? :/

    Gruss Black Rider

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Kogoro-Christopher () aus folgendem Grund: Echte Daten rausgelöscht

  • Hallo Black Rider und Willkommen im Forum.

    Was sein kann ist, dass deine Datenbank generell alle eingehenden Verbindungen blockt. Dies beinhaltet dann natürlich auch den root-User. Das trifft man häufig bei Webserveranbietern an. Am besten dahingehend nochmal deine Datenbankeinstellungen je nach Hersteller bzw. Typ überprüfen.

    Ansonten ist der Quellcode ja eins zu eins bis dahingehend, dass das newInstance in Zeile 18 fehlt.

    P.S.: Bitte trotz privater Nutzung nie Serverdaten preisgeben!
    MfG,
    Christopher

    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • da sollte ich auch alle Rechte haben.


    Annahme oder Gewissheit ?

    Schau doch mal mit dem phpymyAdmin auf deine Nas und prüfe was root alles darf.

    Standard mässig habe ich für root nur lokalen Zugriff ( Synology NAS hat ja seit einiger Zeit MariaDB) drauf

    root 127.0.0.1 Nein ALL PRIVILEGES Ja Rechte ändern Rechte ändern Exportieren Exportieren
    root ::1 Nein ALL PRIVILEGES Ja Rechte ändern Rechte ändern Exportieren Exportieren
    root kpnas Nein ALL PRIVILEGES Ja Rechte ändern Rechte ändern Exportieren Exportieren
    root localhost Nein ALL PRIVILEGES Ja Rechte ändern Rechte ändern Exportieren Exportieren


    Wie du siehst fehlt da der "any" Host Eintrag

    root % Ja ALL PRIVILEGES Ja Rechte ändern Rechte ändern Exportieren Exportieren


    Falls der nicht da ist, gibt es auch keinen externen Zugriff.
  • Hallo zusammen

    Danke für die Antworten.

    Um sicherzugehen das mit der Datenbank alles in Ordnung ist, habe ich kurz ein C# Programm geschrieben welches mir von der einen Tabelle den ersten Wert ausliesst. Ihr hattet recht, musste vom root noch die Privilegien für % setzen, dann ging mein C# Programm.
    Mein Java App jedoch leider nicht :(

    Ich habe die newInstance() hinzugefgüt, hat sich nicht geändert.

    Ich gebe aber nicht auf, werde jetzt weiter nach der Lösung suchen.
    Wenn jemand noch einen Tipp hat, nur her damit :D

    Gruss Black Rider

    PS: Danke für die Editierung, war vollkommend richtig, aber ich hatte es schon geändert. Würde als rootpasswort doch nie lulu nehmen xD
  • Konnte enoch bisschen mehr herausfinden. Der Android Device Monitor ist ja auch cool :D

    Quellcode

    1. 07-08 13:38:32.329: W/System.err(3216): com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
    2. 07-08
    3. 13:38:32.329: W/System.err(3216): The last packet sent successfully to
    4. the server was 0 milliseconds ago. The driver has not received any
    5. packets from the server.
    6. 07-08 13:38:32.346: W/System.err(3216): at java.lang.reflect.Constructor.newInstance(Native Method)
    7. 07-08 13:38:32.347: W/System.err(3216): at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
    8. 07-08 13:38:32.347: W/System.err(3216): at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
    9. 07-08 13:38:32.347: W/System.err(3216): at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1137)
    10. 07-08 13:38:32.347: W/System.err(3216): at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:356)
    11. 07-08 13:38:32.347: W/System.err(3216): at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2504)
    12. 07-08 13:38:32.347: W/System.err(3216): at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2541)
    13. 07-08 13:38:32.348: W/System.err(3216): at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2323)
    14. 07-08 13:38:32.348: W/System.err(3216): at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:832)
    15. 07-08 13:38:32.348: W/System.err(3216): at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46)
    16. 07-08 13:38:32.348: W/System.err(3216): at java.lang.reflect.Constructor.newInstance(Native Method)
    17. 07-08 13:38:32.348: W/System.err(3216): at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
    18. 07-08 13:38:32.348: W/System.err(3216): at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
    19. 07-08 13:38:32.349: W/System.err(3216): at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:417)
    20. 07-08 13:38:32.349: W/System.err(3216): at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:344)
    21. 07-08 13:38:32.349: W/System.err(3216): at java.sql.DriverManager.getConnection(DriverManager.java:179)
    22. 07-08 13:38:32.349: W/System.err(3216): at java.sql.DriverManager.getConnection(DriverManager.java:144)
    23. 07-08 13:38:32.349: W/System.err(3216): at com.example.blackrider.easyvoci.c_MySQL.Connect(c_MySQL.java:30)
    24. 07-08 13:38:32.349: W/System.err(3216): at com.example.blackrider.easyvoci.Activity_Main$2.onClick(Activity_Main.java:62)
    25. 07-08 13:38:32.349: W/System.err(3216): at android.view.View.performClick(View.java:4598)
    26. 07-08 13:38:32.363: D/LightsService(1701): Excessive delay setting light: 141ms
    27. 07-08 13:38:32.399: W/System.err(3216): at android.view.View$PerformClick.run(View.java:19268)
    28. 07-08 13:38:32.399: W/System.err(3216): at android.os.Handler.handleCallback(Handler.java:738)
    29. 07-08 13:38:32.399: W/System.err(3216): at android.os.Handler.dispatchMessage(Handler.java:95)
    30. 07-08 13:38:32.399: W/System.err(3216): at android.os.Looper.loop(Looper.java:135)
    31. 07-08 13:38:32.399: W/System.err(3216): at android.app.ActivityThread.main(ActivityThread.java:5070)
    32. 07-08 13:38:32.399: W/System.err(3216): at java.lang.reflect.Method.invoke(Native Method)
    33. 07-08 13:38:32.406: W/System.err(3216): at java.lang.reflect.Method.invoke(Method.java:372)
    34. 07-08 13:38:32.406: W/System.err(3216): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:836)
    35. 07-08 13:38:32.414: W/System.err(3216): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:631)
    36. 07-08 13:38:32.414: W/System.err(3216): Caused by: java.net.SocketException: android.os.NetworkOnMainThreadException
    37. 07-08
    38. 13:38:32.416: W/System.err(3216): at
    39. com.mysql.jdbc.StandardSocketFactory.unwrapExceptionToProperClassAndThrowIt(StandardSocketFactory.java:393)
    40. 07-08 13:38:32.416: W/System.err(3216): at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:328)
    41. 07-08 13:38:32.417: W/System.err(3216): at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:306)
    42. 07-08 13:38:32.417: W/System.err(3216): ... 24 more
    Alles anzeigen


    Eventuell kann jemand etwas damit anfangen. Ich leider nicht.
  • Also ich hab mal folgenden Code bei mir reingehackt.

    Java-Quellcode

    1. private static final String url = "jdbc:mysql://192.168.178.110:3306/test";
    2. private static final String user = "testuser";
    3. private static final String pass = "testpasswort";
    4. @Override
    5. protected void onCreate(Bundle savedInstanceState) {
    6. super.onCreate(savedInstanceState);
    7. setContentView(R.layout.activity_main);
    8. testDB();
    9. }
    10. public void testDB() {
    11. TextView tv = (TextView)this.findViewById(R.id.textView2);
    12. try {
    13. Class.forName("com.mysql.jdbc.Driver");
    14. Connection con = DriverManager.getConnection(url, user, pass);
    15. Log.i("KAN","Database connection success");
    16. String result = "Database connection success\n";
    17. Statement st = con.createStatement();
    18. ResultSet rs = st.executeQuery("select * from `test` ");
    19. ResultSetMetaData rsmd = rs.getMetaData();
    20. while(rs.next()) {
    21. result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";
    22. result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";
    23. result += rsmd.getColumnName(3) + ": " + rs.getString(3) + "\n";
    24. }
    25. tv.setText(result);
    26. }
    27. catch(Exception e) {
    28. e.printStackTrace();
    29. tv.setText(e.toString());
    30. }
    31. }
    Alles anzeigen


    mysql-connector-java-5.1.30-bin.jar

    Die LoginDaten sind jetzt nicht wirklich relevant (lokale NAS) (Testuser angelegt, DB mit Namen Test angelegt , 3 Felder id/name/testfeld int )
    Kleine Anmerkung:

    Da ich gerne für "alte" Geräte programmiere, hängt hier an meinem DEV-Rechner noch ein Samsung Galaxy 1 (9001), da läuft noch Android 2.3 drauf.

    Bei neueren Geräten also ANdroid 3 aufwärts dürfte es nötig sein, Datenbank operationen in einen eigene Thread zu kapsel. Zum Beispiel AsyncTask.

    Falls du ein Android 4+ Gerät hast, könnte das die Ursache für den Absturz sein. (Zum Testen kannst du natürlich auch den Strict Mode aktivieren).

    Achso Textview nur zur DummyAusgabe

    Quellcode

    1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. tools:context="${relativePackage}.${activityClass}" >
    6. <TextView
    7. android:id="@+id/textView2"
    8. android:layout_width="wrap_content"
    9. android:layout_height="wrap_content"
    10. android:text="@string/hello_world" />
    11. </RelativeLayout>
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von killphil75 ()

  • Killphil, vielen vielen Dank :D:D


    Folgendes gemacht:

    • Neuer Emulator mit Android 2.3 erstellt. (Vorher 4.3!! (Fehler))
    • Neues Projekt mit Deinem Code erstellt.
    • Auch in dieses Projekt die Internetpermission + Access_network_start in die Manifest geschrieben
    • MySQL Connector v. 5.1.31 neu heruntergeladen.
    Und was seh ich da im Emulator? Meinen Namen welcher gerade aus der Datenbank gefischt wurde :)

    Wie ich gerade sehe, funktioniert es auf meinem Handy (Samsung Galaxy S3 mit Android 4.3) nicht. Also wird die ganze Sache wirklich gewesen sein, weil es in ein Thread muss. Denn ich hatte vorher immer einen 4.3 Emulator benutzt, wie mein Handy halt.
    Warum das eigtl.? Mag es Android 3.+ nicht wenn der Mainthread durch eine Netzwerkaktion blockiert wird?
    Ich werde mir also morgen mal diesen AsyncTask angucken. Wird ja nix anderes sein, als n Backgroundworker.
    Ich dank Dir nochmal und gn8 :)
    Gruss
    Black Rider
  • Ja das haben sie mit Android 3 eingeführt. Alles was den Gui Thread ausbremst ist böse. Google wollte die Oberflaeche immer responsiv halten. Daher Netzwerkaktionen, lange Berechnungen, lange DB Zugriffe immer in einen Thread... kommunikation zum Gui per Handler. Oder einfacher per AsyncTask. :)
  • Naja, ist ja eigtl. auch nur richtig so. Keine will ein stockendes Handy.

    Ich habe jetzt die ganze Sache in einem AsyncTask gemacht (Coole Sache :D)

    Java-Quellcode

    1. package com.example.blackrider.mysql;
    2. import android.os.AsyncTask;
    3. import android.support.v7.app.ActionBarActivity;
    4. import android.os.Bundle;
    5. import android.util.Log;
    6. import android.view.Menu;
    7. import android.view.MenuItem;
    8. import android.widget.TextView;
    9. import java.sql.Connection;
    10. import java.sql.DriverManager;
    11. import java.sql.ResultSet;
    12. import java.sql.ResultSetMetaData;
    13. import java.sql.Statement;
    14. public class MyActivity extends ActionBarActivity {
    15. private static final String url = "jdbc:mysql://10.0.0.29:3306/datenbankname";
    16. private static final String user = "username";
    17. private static final String pass = "ichbineinpasswort";
    18. @Override
    19. protected void onCreate(Bundle savedInstanceState) {
    20. super.onCreate(savedInstanceState);
    21. setContentView(R.layout.activity_my);
    22. new TestAsynch().execute();
    23. }
    24. @Override
    25. public boolean onCreateOptionsMenu(Menu menu) {
    26. // Inflate the menu; this adds items to the action bar if it is present.
    27. getMenuInflater().inflate(R.menu.my, menu);
    28. return true;
    29. }
    30. @Override
    31. public boolean onOptionsItemSelected(MenuItem item) {
    32. // Handle action bar item clicks here. The action bar will
    33. // automatically handle clicks on the Home/Up button, so long
    34. // as you specify a parent activity in AndroidManifest.xml.
    35. int id = item.getItemId();
    36. if (id == R.id.action_settings) {
    37. return true;
    38. }
    39. return super.onOptionsItemSelected(item);
    40. }
    41. class TestAsynch extends AsyncTask<Void, Integer, String>
    42. {
    43. protected void onPreExecute ()
    44. {
    45. }
    46. protected String doInBackground(Void...arg0)
    47. {
    48. String result = "";
    49. try {
    50. Class.forName("com.mysql.jdbc.Driver");
    51. Connection con = DriverManager.getConnection(url, user, pass);
    52. result += "Database connection success\n";
    53. Statement st = con.createStatement();
    54. ResultSet rs = st.executeQuery("select * from `User` ");
    55. ResultSetMetaData rsmd = rs.getMetaData();
    56. while(rs.next()) {
    57. result += rsmd.getColumnName(1) + ": " + rs.getInt(1) + "\n";
    58. result += rsmd.getColumnName(2) + ": " + rs.getString(2) + "\n";
    59. }
    60. }
    61. catch(Exception e) {
    62. e.printStackTrace();
    63. result = e.toString();
    64. }
    65. return result;
    66. }
    67. protected void onProgressUpdate(Integer...a)
    68. {
    69. }
    70. protected void onPostExecute(String result)
    71. {
    72. TextView tv = (TextView) findViewById(R.id.textView2);
    73. tv.setText(result);
    74. }
    75. }
    76. }
    Alles anzeigen


    xml so belassen wie beim HelloWorld example vom Android Studio (Also einfach ein TextView drin) und in der AndroidManifest.xml muss das noch rein:

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    Und dann klappt es, getestet Emulator Version 2.3 / 4.3 und Samsung Galaxy S3 mit v. 4.3

    Killphil nochmals vielen Dank für die Hilfe.

    Jetzt kanns los gehen :)

    Gruss Black Rider