Informationen für Datenbankverbindung wo/wie speichern?

Danloc

Mitglied
Hallo zusammen,

ich habe eine Oberfläche, in der ich alle Informationen für die Datenbankverbindung eintrage um mich mit der Datenbank zu verbinden.
Jetzt würde ich die Verbindungsinformationen gerne speichern, sodass beim nächsten Start des Programmes die Verbindungsinformationen automatisch abgerufen werden können.
Außerdem soll meine Anwendung nicht nur auf Windows rechnern laufen.

Folgende Ansätze und Ideen habe ich im Kopf durchgespielt:

- Speichern in der Datenbank (ohne Verbindungsinformationen keine Verbindung und keine Daten Henne-Ei Problem.)

- Speichern direkt in den Textfeldern (Wird mit Neustart des Programmes gelöscht?!)

- Speichern in einer Textdatei (Problem mit Pfaden, da Windows und Linux anders adressiert werden müssen?)

Die Informationen sollen automatisch von meinem Programm hinterlegt werden. Der User soll keinerlei Berührungspunkt zu dieser Datei haben, wie z.B. Pfadangabe treffen o.Ä.

Hat jemand einen Tipp wie man so etwas "üblicherweise" löst. Was ist good and bad practice?

Danke schonmal

Grüße Danloc
 

Danloc

Mitglied
genau so etwas habe ich gesucht! Mir fehlten bei meiner Suche scheinbar die richtigen Schlagwörter.
Jedenfalls funktioniert das Tadelos und bietet nebenbei noch viele features wie export/import usw. :)

Dankeschön tommysenf, für die schnelle Antwort.
 

Danloc

Mitglied
So, falls es jemanden nach mir interessiert:
Hier mal mein Lösungsansatz als kleines Beispiel, Ergänzend zum Post von tommysenf.

Über ein Button wird ein Eingabefenster geöffnet und die Inhalte der Textfelder gesetzt. Der default Wert ist "", somit werden nur Daten geladen, die auch gespeichert sind (sonst eben ein "Leerstring").

Java:
 private void mniOptionenDatenbankverbindungActionPerformed(java.awt.event.ActionEvent evt) {                                                              
       
        Preferences Pref = Preferences.userNodeForPackage(ErstellenMainForm.class);
       
        String prfDatenbankIpAdresse = Pref.get("DatenbankIP", "");
        String prfDatenbankPort = Pref.get("DatenbankPort", "");
        String prfDatenbankName = Pref.get("DatenbankName", "");
        String prfDatenbankBenutzer = Pref.get("DatenbankBenutzer", "");
        String prfDatenbankPassworttext = Pref.get("DatenbankPasswort", "");
       
        tfdIpadresse.setText(prfDatenbankIpAdresse);
        tfdPort.setText(prfDatenbankPort);
        tfdDatenbankName.setText(prfDatenbankName);
        tfdBenutzername.setText(prfDatenbankBenutzer);
        pfdPasswort.setText(prfDatenbankPassworttext);
               
        OptionDatenbankVDialog.setLocationRelativeTo(this.CenterPanlelErstellen);
        OptionDatenbankVDialog.setVisible(true);
}

In diesem Sinne...

Vielen Dank und bis dahin

Über einen Weiteren Button "Testen" innerhalb des zuvor geladenen Fensters, würden dann die Werte gespeichert, eine Datenbankverbindung mit diesen werten hergestellt und eine Ausgabe erzeugt. Alles innerhalb einer try-catch Anweisung - Somit wird immer nur die letzte funktionierende Verbindung gespeichert!

Java:
    private void btnOptionsDatenbankvTestenActionPerformed(java.awt.event.ActionEvent evt) {                                                          
        try {
           
                Connection SQLVerbindung = null;
                Class.forName("com.mysql.jdbc.Driver");

                String strDatenbankIpAdresse = tfdIpadresse.getText();
                String strDatenbankPort = tfdPort.getText();
                String strDatenbankName = tfdDatenbankName.getText();
                String strDatenbankBenutzer = tfdBenutzername.getText();
                String strDatenbankPassworttext = String.valueOf(pfdPasswort.getPassword());
               


                if(!strDatenbankIpAdresse.isEmpty() && !strDatenbankPort.isEmpty() && !strDatenbankName.isEmpty()
                   && !strDatenbankBenutzer.isEmpty() && !strDatenbankPassworttext.isEmpty()){
                       
                        Preferences Pref = Preferences.userNodeForPackage(ErstellenMainForm.class);

                        //Preferences Speichern. Pref "DatenbankIP" = strDatenbankIpAdresse
                        Pref.put("DatenbankIP", strDatenbankIpAdresse);
                        Pref.put("DatenbankPort", strDatenbankPort);
                        Pref.put("DatenbankName", strDatenbankName);
                        Pref.put("DatenbankBenutzer", strDatenbankBenutzer);
                        Pref.put("DatenbankPasswort", strDatenbankPassworttext);  
                  }

              
                SQLVerbindung = DriverManager.getConnection("jdbc:mysql://" + strDatenbankIpAdresse + ":" + strDatenbankPort
                                                            + "/" + strDatenbankName, strDatenbankBenutzer, strDatenbankPassworttext);
               
                lblVerbindungsInfo.setText("Die Verbindung wurde Erfolgreich hergestellt!");
                txaVerbindungsOutput.append(SQLVerbindung.toString());
                InfoDatenbankVDialog.setLocationRelativeTo(this.OptionDatenbankVDialog);
                InfoDatenbankVDialog.setVisible(true);
           
          
          
        }catch (Exception exc) {
           
            lblVerbindungsInfo.setForeground(Color.red);
            lblVerbindungsInfo.setText("Die Verbindung konnte nicht hergestellt werden!");
            txaVerbindungsOutput.append(exc.toString());
            InfoDatenbankVDialog.setLocationRelativeTo(this.OptionDatenbankVDialog);
            InfoDatenbankVDialog.setVisible(true);
            exc.printStackTrace();
            }

In diesem Sinne, bis dahin.;)
 

JStein52

Top Contributor
Ich weiss nicht ob das in deinem Anwendungsfall ein Problem ist, aber du weisst schon dass du auf diese Art deine Anmeldedaten unverschlüsselt auf deinem Rechner speicherst
 

Danloc

Mitglied
Ja, soweit ich es verstanden habe, werden die Preferences (String Variablen) in eine XML datei geschrieben oder?

Mein gedanke war also Folgender:
Ich nehme den Inhalt der Variable "strDatenbankPassworttext " und "verwüste" ihn mit einem Algorithmus. In meinem Anwendungsfalls würde es ausreichen, wenn das Passwort nicht im Klartext in der XML Datei Landet. Um also nicht allzugroßen Aufwand betreiben zu müssen, würde ich MD5 oder vielleicht SHA-1 nehmen.

Allerdings sehe ich das als eine andere Baustelle an. Sprich, ich würde eine Methode zum endcoden und eine decoden hinzufügen und diese jeweils vor dem Speichern bzw. nach dem auslesen der Variable verwenden. Soweit mein Plan, bin aber gerne für andere Anregungen offen ;).

Jetzt habe ich allerdings noch ein Bug in meinem Oben gesposteten Code endeckt, den ich mir noch nicht so 100% erklären kann, vielleicht kann jemand dazu noch einen Tipp geben (Ich versuche es mal zu erklären).

Wenn ich jetzt Das Fenster, in der die Informationen eintragen werden öffne, und ich von der Letzten Verbindung noch korrekte Informationen vorliegen haben, klappt die erneute Verbindung ohne Probleme.

Tippe ich dann falsche Informationen in meine Anmeldemaske ein, klappt die Verbindung Logischerweise nicht und die Fehlermeldung erscheint, wie erwartet.

Wenn ich dann, dass Fenster erneut öffne, stehen hier aber nicht die Informationen der letzten korrekten Verbindung, sondern die Falschen Informationen drin (also die, die ich zuletzt eingetragen habe. Ganz egal ob die Verbindung erfolgreich war oder nicht).
Auch nach erneuerter Eingabe kann ich keine Vernindung aufbauen, erst sobald ich das ganze Programm einmal neu gestartet habe.

Mir ist also nicht ganz klar, wie meine Try-Catch hier arbeitet. Es scheint so, als würde innerhlabe des Try
folgendes ausgeführt (Die Felder sind auch nicht leer, also die if Bedinung arbeitet wie erwartet)
Java:
                if(!strDatenbankIpAdresse.isEmpty() && !strDatenbankPort.isEmpty() && !strDatenbankName.isEmpty()
                   && !strDatenbankBenutzer.isEmpty() && !strDatenbankPassworttext.isEmpty()){
                       
                        Preferences Pref = Preferences.userNodeForPackage(ErstellenMainForm.class);

                        //Preferences Speichern. Pref "DatenbankIP" = strDatenbankIpAdresse
                        Pref.put("DatenbankIP", strDatenbankIpAdresse);
                        Pref.put("DatenbankPort", strDatenbankPort);
                        Pref.put("DatenbankName", strDatenbankName);
                        Pref.put("DatenbankBenutzer", strDatenbankBenutzer);
                        Pref.put("DatenbankPasswort", strDatenbankPassworttext);  
                  }

obwohl folgende Verbindung nicht aufgebaut werden kann
Java:
                SQLVerbindung = DriverManager.getConnection("jdbc:mysql://" + strDatenbankIpAdresse + ":" + strDatenbankPort
                                                            + "/" + strDatenbankName, strDatenbankBenutzer, strDatenbankPassworttext);
 

mrBrown

Super-Moderator
Mitarbeiter
Ich nehme den Inhalt der Variable "strDatenbankPassworttext " und "verwüste" ihn mit einem Algorithmus. In meinem Anwendungsfalls würde es ausreichen, wenn das Passwort nicht im Klartext in der XML Datei Landet. Um also nicht allzugroßen Aufwand betreiben zu müssen, würde ich MD5 oder vielleicht SHA-1 nehmen.

Allerdings sehe ich das als eine andere Baustelle an. Sprich, ich würde eine Methode zum endcoden und eine decoden hinzufügen und diese jeweils vor dem Speichern bzw. nach dem auslesen der Variable verwenden. Soweit mein Plan, bin aber gerne für andere Anregungen offen ;).
MD5 und SHA-1 sind Hash-Funktionen, und nur in die eine Richtung praktikabel ;) "Entschlüsseln" kannst du die nicht...

Du solltest das Passwort entweder vor dem Speichern Verschlüsseln, oder das Passwort nicht speichern.


Mir ist also nicht ganz klar, wie meine Try-Catch hier arbeitet. Es scheint so, als würde innerhlabe des Try
folgendes ausgeführt (Die Felder sind auch nicht leer, also die if Bedinung arbeitet wie erwartet)
Das arbeitet genau so, wie du es geschrieben hast ;)

Die Verbindung wird erst nach dem if ausgeführt - wenn die Verbindung fehl schlägt, ist der Code zum Speichern schon ausgeführt worden (so wie ich ja grad auch schon sagte).

Wenn nur gespeichert werden soll, wenn die Verbindung erfolgreich ist, solltest du auch erst dann speichern, wenn die Verbindung erfolgreich ist ;)
 

Danloc

Mitglied
@mrBrown, ich habe das Speichern dahinter gesetzt, jetzt werden nurnoch korrekte Daten gespeichert.

Der Fehler den ich Oben beschrieben habe ist aber nach wie Vor vorhanden.

Mit Korrekten Informationen:
Verbindungklappt.PNG

Mit Falschen Informationen:
KeineVerbindung.PNG
Code:
com.mysql.jdbc.JDBC4Connection@1894b26ccom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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.

Erneuter Versuch mit Richtigen Informationen:
keineVerbindung2.PNG
Code:
com.mysql.jdbc.JDBC4Connection@b7fc982com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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.com.mysql.jdbc.JDBC4Connection@25b7bf8ecom.mysql.jdbc.JDBC4Connection@3195f73f

Also Die Anzeige stimmt schonmal, es erscheint auch die Meldung, die Verbindung hätte funktioniert aber die SQL Meldung sagt etwas anderes ..

Jetzt bin ich etwas verwirrt :confused:
 

Danloc

Mitglied
So, ich habe mich mal in der registry umgesehen und meine Daten sind auch alle korrekt hinterlegt.
Obwohl ich mittels preferences nur auf den user Bereich zugreife, erhalte ich eine Fehlermeldung:
Code:
run:
Jan 13, 2018 2:47:22 PM java.util.prefs.WindowsPreferences <init>
WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.
BUILD SUCCESSFUL (total time: 5 seconds)

Bei stackoverflow habe ich gelesen, dass dies wohl ein Bug des JDK sei.
Diving into the JDK source code you'll see that 0x80000002 means HKLM, i.e. the place in the Win Registry that shouldn't be touched. Your code never references the system tree and yet you still see this warning !?? (At this point you must be ripping all your hair out ... as I did)

Well, this is one of the rare occasions where there really is a JDK bug..
Link:https://stackoverflow.com/questions/5354838/java-java-util-preferences-failing

Nichts destro trotz, werden von meine Programm alle Daten richtig "ausgelesen" - Ich kann also auch an dieser Stelle keinen Fehler erkennen.

Mein oben beschriebenes Problem besteht also nach wie vor :(
 

Danloc

Mitglied
Morgen zusammen,

ich habe den Fehler entdeckt. Es ist schon fast peinlich. :oops:

Das Fenster, auf welchem ich das SQL Result der Verbindung ausgebe, habe ich über einen Button geschlossen.
Das ausgelöste Event enthielt den Methoden Aufruf:
Java:
InfoDatenbankVDialog.dispose();
Ich setzte den Text des feldes nun zusätzlich auf Leerstring und siehe da, es funktioniert! Ich hatte also nie ein Problem mit der Verbindung, es wurde ledeglich die Meldung der vorherigen action mit ausgegeben. :confused:

Naja das ist wohl eine dieser Erfahrungen, die man machen muss und welche man nie mehr vergisst.

Danek für eure Hilfe!

Gruß Danloc
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
S Verschiedene Informationen gleichen Typs speichern und auslesen Datenbankprogrammierung 4
S MySQL Server Informationen abfragen Datenbankprogrammierung 6
D Verknüpfung auflösen für Frontend Datenbankprogrammierung 7
R Beste Lösung für User Erstellung in mongodb Datenbankprogrammierung 1
I SaaS Applikation: pro Kunde eine Datenbank / Schema oder eine DB für alle Kunden? Datenbankprogrammierung 76
O apache derby in eclipse für Datenbanken einbauen Datenbankprogrammierung 3
Zrebna Empfehlung für ein kostenloses DB-Hosting gesucht Datenbankprogrammierung 6
M Lösungsvorschläge für Multi-User Datenbankprogrammierung 1
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Denkanstoß für Ranking Datenbankprogrammierung 1
L Oracle Repräsentative Namen für die Column Types Datenbankprogrammierung 9
OnDemand Struktur für Parent / Child Produkt Datenbankprogrammierung 5
N ORM für Sqlite Datenbankprogrammierung 4
I Konzept: Klasse / Entity für Einstellung der Software Datenbankprogrammierung 3
H suche eine Login system Bibliothek für Java Datenbankprogrammierung 5
ruutaiokwu MySQL MariaDB-Client-Zertifkate, nur für einen bestimmten User Datenbankprogrammierung 5
B Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle Datenbankprogrammierung 12
O Dokumentation für MariaDB 10.3. Datenbankprogrammierung 2
F MariaDatabase Einstellungen für Verbindungen Datenbankprogrammierung 5
Dimax MySQL Trigger für eine Spalte Datenbankprogrammierung 5
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
B Brauche Tipps für Datenbankdesign Datenbankprogrammierung 8
B Tabelle für "wiederkehrende Rechnungen" Datenbankprogrammierung 12
J Warum sind Sockets für einen Live-Chat sinnvoll? Datenbankprogrammierung 8
R Java-Befehle/Operatoren für copy&paste Datenbankprogrammierung 2
X PostgreSQL Datenbankdesign für Vokabeltrainer Datenbankprogrammierung 48
@SupressWarnings() HSQLDB Datenbank für mein Dorfbauspiel "Time of Kings" Datenbankprogrammierung 6
M Idee Umsetzung //NFC Eintrittskarten für Geburtstag Datenbankprogrammierung 2
looparda Architektur für JPA Hibernate Umstieg Datenbankprogrammierung 14
P Datanbank für Java-Programmierung Datenbankprogrammierung 10
M Feedback für neues Buch über "Java und Datenbanken" erwünscht Datenbankprogrammierung 8
J SQLite Ich muss für mein Projekt meine Datenbank Kapseln Datenbankprogrammierung 2
J Tipps für ERM Datenbankprogrammierung 4
P Highlevel-Lösung für Speicherung von Baumstruktur mit unbekannter Tiefe Datenbankprogrammierung 1
F welche Datenbank für Messwerte? Datenbankprogrammierung 4
E Warum werden für Datenbanktabellen Schemanamen festgelegt? Datenbankprogrammierung 1
M DB Schema für Vokabeltrainer Datenbankprogrammierung 2
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
E Kann man, wenn man in DB2 Tabellen erstellt hat für dessen auch einen Command-File erstellen? Datenbankprogrammierung 1
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
S HSQLDB Fehlermeldung für den Bildschirm Datenbankprogrammierung 3
L Datenmodell erstellen für eine Nutzertanalyse Datenbankprogrammierung 1
I Query für Geburtstage Datenbankprogrammierung 6
L Zentrale Datenbank im Internet für Spiele Highscores? Datenbankprogrammierung 1
P Derby/JavaDB Csv Datei für dieses Musterprogramm Datenbankprogrammierung 12
ruutaiokwu code-formatter für t-sql... Datenbankprogrammierung 12
J Plug-In-Framework für Hibernate-Klassen Datenbankprogrammierung 0
T Mehrsprachigkeit für Tabellenfelder Datenbankprogrammierung 6
E MySQL Große Datenmengen reibungslos speichern für Gameserver Datenbankprogrammierung 6
F MSSql oder MongoDB für die Speicherung von POI Datenbankprogrammierung 9
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
P MySQL Historie für ein Objekt anlegen Datenbankprogrammierung 5
P MySQL eine richtige Datenbank für einen routenplaner erstellen Datenbankprogrammierung 2
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J Datenbank für Fragen/ Antworten Datenbankprogrammierung 7
O Datenbankschnittstelle für Java Datenbankprogrammierung 8
L Datenbank für kleinere Anwendungen Datenbankprogrammierung 3
N Query für Derby DB mit Enterbrise Bean Datenbankprogrammierung 4
S ich brauche tipps für JDBC Datenbankprogrammierung 4
I Hibernate - Best Practice für Lazy Loading Datenbankprogrammierung 3
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
GianaSisters SQL Befehl für allgemeine Datenbankexistenz Datenbankprogrammierung 4
B Beispiel für sicheres DBUsername/DBPassword handling Datenbankprogrammierung 4
I Anfänger-Tutorial für Hibernate gesucht Datenbankprogrammierung 3
heart_disease Beratung für Datenbankdesign Datenbankprogrammierung 13
C Embedded DB für Java Datenbankprogrammierung 26
J Unterstützung für verschiedene Datenbanken Datenbankprogrammierung 2
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
F suche Erstanschub für DB-Zugriff Datenbankprogrammierung 9
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
F Performance-Tool für Oracle Datenbankprogrammierung 2
T Kleine Tabellen für schnellere abfragen? Datenbankprogrammierung 3
C Split String für SQl query Datenbankprogrammierung 10
A update methode für datenbank Datenbankprogrammierung 2
N Datenbank für Dateien Datenbankprogrammierung 6
N Datenbank für einen Stundenplan Datenbankprogrammierung 4
G welche Datenbanktabellen für folgende Attribute Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
S JPA (EntityManager für jeden Nutzer?) Datenbankprogrammierung 8
J Buffer Manager für Datenbank Datenbankprogrammierung 4
F SQL Voraussetzung für JDBC? Datenbankprogrammierung 10
R Bei Webformular DropDown Felder JA, NEIN! Was für einen Datentyp verwenden? Datenbankprogrammierung 7
T SSL Zertifikat für mysql datenbankzugriff Datenbankprogrammierung 6
T Debugger für SQL? Datenbankprogrammierung 5
Chtonian Effizientes Query System für Wortnachschlagewerk Datenbankprogrammierung 9
G Tabelle für Zeitraum sperren Datenbankprogrammierung 4
A Struct für Datenbank abfrage? Datenbankprogrammierung 12
O Hibernate für Eclipse Datenbankprogrammierung 5
T JPQL Query für eine Tabellenansicht Datenbankprogrammierung 2
D Sicherheit für Datenbankverbindung Datenbankprogrammierung 19
S Standard für Datenbanken Datenbankprogrammierung 3
R Entfernte MySQL Datenbank für lokale Swing-App Datenbankprogrammierung 8
Landei Mehre Werte für einen Prepared-Statement_Parameter übergeben? Datenbankprogrammierung 3
G Einheitliches Casting für Decimal und Integer-Werte Datenbankprogrammierung 5
G TippSpiel für Bundesliga programieren Datenbankprogrammierung 4

Ähnliche Java Themen


Oben