Erste Schritte Datenbankverbindung: Der Treiber lädt nicht

Kros

Mitglied
Hallo zusammen

Ich versuche mich mit der Java DB (Derby) zu verbinden. Leider schaff ich das nicht. Ich habe zwei Klassen, welche leicht unterschiedlich aufgebaut sind, um mich mit der DB zu verbinden. Welche Klasse die Verbindung Steuert, kann ich in einem Formular über zwei Buttons auswählen. Übrigens, ich arbeite mich gerade in NetBeans ein. Über NetBeans, kann ich mich mit Java DB verbinden, nur direkt über den Code schaff ich es (noch) nicht.

Das ganze dient nur zur Übung und zum Lernen. Nun klappen beide Verbindungen nicht. Vielleicht kann mir ja jemand einen Tipp geben.

Klasse1: HelloDerby
Die Konsole gibt mir folgendes raus:
"HelloDerby.Ausführen() ist gestertet"

Bedeutet wohl, das im ersten TRY Block etwas schief läuft. Wobei keine Exeption ausgelöst wird und das Prog auch weiterläuft.

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Datenbank;

/**
 *
 * @author Chris
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Locale;

public class HelloDerby {
    
//    static final String DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
    static final String DRIVER = "org.apache.derby.jdbc.ClientDriver";
    static final String URL = "jdbc:derby:derbydb;create=true";
    static final String CREATE_TABLE = "create table hello( world varchar(100))";
    static final String DROP_TABLE = "drop table hello";
    static final String INSERT = "insert into hello values (Hello World)";
    static final String SELECT = "select * from hello";
    
    
    public static void Ausführen(){
        System.out.println("HelloDerby.Ausführen() ist gestertet");
        try {
            Class.forName(DRIVER).newInstance();
            System.out.println("der Treiber ist geladen");
            System.out.println("Nun gehts um die Connection");
            Connection connection = DriverManager.getConnection(URL);
            try (Statement statement = connection.createStatement()) {
                ResultSet resultSet;

                
                statement.execute(CREATE_TABLE);
                statement.execute(INSERT);
                resultSet = statement.executeQuery(SELECT);
                while(resultSet.next()) {
                    System.out.println(resultSet.getString(1));
                }
                resultSet.close();
                statement.execute(DROP_TABLE);
            }

                    
        } catch( ClassNotFoundException | InstantiationException | IllegalAccessException | SQLException ex ) {
        }
        
    }
}

Klasse2: Derby
Die Konsole gibt mir folgendes raus:
"Der JDBC-Treiber konnte nicht geladen werden. Die Fehlermeldung lautet: org.apache.derby.jdbc.ClientDriver
Java Result: 1
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 2 Sekunden)"

Hier auch wieder der erste TRY-Block, nur das ich aus dem Prog rausgeschmissen werde.

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Datenbank;
/*
 *
 * @author Chris
 */
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class Derby {

    /**
     * Verbindung zur Datenbank
     */
    Connection verbindung;

    /**
     * JDBC-Treiber-Name. Muss im Klassenpfad sein.
     */
    static final String DRIVER 
        = "org.apache.derby.jdbc.ClientDriver";
    
    /**
     * Verbindungs-URL. Erstellt beim ersten Aufruf eine neue Datenbank.
     */
    static final String URL 
       // = "jdbc:derby:c:/derbydbs/sampledb;create=true";
          = "jdbc:derby://localhost:1527/DBTEST";
    
    /**
     * Benutzername für die Datenbank Anmeldung
     */
     static final String BENUTZER= ""; //Muster Hans";
    
     /**
     * Passwort für die Datenbank Anmeldung
     */
    static final String PASSWORD = ""; // "daserrätsdunie";

     /**
     * Verbindung zur Datenbank herstellen. 
     */
    
    public void connect() {
        // Treiber laden
        try {
            Class.forName (DRIVER).newInstance();
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex ) {
            System.out.println("Der JDBC-Treiber konnte nicht " +
                    "geladen werden. " +
                    "Die Fehlermeldung lautet: " + ex.getMessage() );
            System.exit(1);
        }
        
        // Verbindung herstellen
        try {
            verbindung = DriverManager.getConnection(URL);
        } catch( SQLException ex ) {
            System.out.println("Die Verbindung zur Datenbank konnte " +
                    "nicht hergestellt werden. " +
                    "Die Fehlermeldung lautet: " + ex.getMessage() );
            System.exit(1);
        }
    }
    
    /**
     * Verbindung trennen
     */
    public void disconnect() {
        try {
            if(verbindung != null && !verbindung.isClosed()) {
                verbindung.close();
                verbindung = null;
            }
        } catch( SQLException ex ) {
            System.out.println("Die Verbindung zur Datenbank " +
                    "konnte nicht geschlossen werden. " +
                    "Die Fehlermeldung lautet: " + ex.getMessage() );
            System.exit(1);
        }
    }
    
    /**
     * Alle Tabellennamen anzeigen
     */
    public void showTables() {
        String query = "select tablename from sys.systables";
        String message = "Datenbankfehler. Die Fehlermeldung lautet: ";
        Statement statement = null;
        ResultSet resultSet = null;
        
        try {
            // Benötige Ressourcen für eine SQL-Anweisung bereitstellen 
            statement = verbindung.createStatement();
            // Select-Anweisung ausführen
            resultSet = statement.executeQuery(query);
            // Alle Tabllennamen anzeigen
            while(resultSet.next()) {
                System.out.println(resultSet.getString(1));
            }
        } catch( SQLException ex ) {
            System.out.println(message + ex.getMessage());
        } finally {
            
            // Alle Ressourcen wieder freigeben
            if( resultSet != null ) {
                try { 
                    resultSet.close();
                } catch( SQLException ex ) {
                    System.out.println(message + ex.getMessage());
                }
            }
            if( statement != null ) {
                try { 
                    statement.close();
                } catch( SQLException ex ) {
                    System.out.println(message + ex.getMessage());
                }
            }
        }
    }
    
    
/**    public static void main(String[] args)  {
        Derby derby = new Derby();
        derby.connect();
        derby.showTables();
        derby.disconnect();
*/
    
    public static void Ausführen(){
            Derby derby = new Derby();
            derby.connect();
            derby.showTables();
            derby.disconnect();
    } 
}
 
T

troll

Gast
NIE leere catch-blöcke !

in einen catch-block gehört IMMER mindestens
Java:
Throwable.printStackTrace();
wobei "Throwable" durch die variable der exception zu ersetzen ist
 

Kros

Mitglied
Hab mich mal schlau gemacht was diese:
Java:
Throwable.printStackTrace();
macht.

Soweit so gut.

Habe den Code nun mit:
Java:
ex.printStackTrace();
ergänzt.

NetBeans bringt dabei folgende Meldung "Throwable.printStackTrace() sollte entfernt werden"

Wenn ich das Projekt dennoch mit dieser zusätzliche Code-Zeile ausführe erhalte ich eine ellenlange Meldung in der Konsole:

Java:
java.lang.ClassNotFoundException: org.apache.derby.jdbc.ClientDriver
Der JDBC-Treiber konnte nicht geladen werden. Die Fehlermeldung lautet: org.apache.derby.jdbc.ClientDriver
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:186)
	at Datenbank.Derby.connect(Derby.java:55)
	at Datenbank.Derby.Ausführen(Derby.java:142)
	at Forms.forDBZugriff.butVerbindenDerbyJavaActionPerformed(forDBZugriff.java:177)
	at Forms.forDBZugriff.access$100(forDBZugriff.java:17)
	at Forms.forDBZugriff$2.actionPerformed(forDBZugriff.java:70)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:308)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:682)
	at java.awt.EventQueue$3.run(EventQueue.java:680)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:696)
	at java.awt.EventQueue$4.run(EventQueue.java:694)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Java Result: 1
ERSTELLEN ERFOLGREICH (Gesamtzeit: 0 Minuten 2 Sekunden)

Noch jemand eine Idee? Kann es sein das ich den Treiber erst irgendwo hin kopieren muss? Wüsste aber nicht wo ich die Datei finden und wohin kopieren müsste.

Noch eine Ergänzung:
Habs nun mit
Java:
System.out.println(Thread.currentThread().getStackTrace());
probiert und da erhalte ich zusätzlich die Meldung in der Konsole:
Java:
[Ljava.lang.StackTraceElement;@6d0af5f3

Kann das weiterhelfen?
 
Zuletzt bearbeitet:

tfa

Top Contributor
Der Treiber (d.h. die Derby-JAR-Datei) muss im Klassenpfad deines Projektes sein. Sonst wird die Klasse nicht gefunden.
 

Kros

Mitglied
Ein Licht am Ende... :) Und wo finde ich diese Datei? Das wär super wenn du mir das noch angeben könntest.

Danke

[EDIT]Hab sie, weis aber nicht genau wo hin damit? Klassenpfad?[/EDIT]
 
Zuletzt bearbeitet:

Kros

Mitglied
Ne, ist ja bei Java schon dabei... Immerhin kann ich mich aus NetBeans mit der Java DB verbinden. Somit muss der Treiber ja irgendwo sein.

Hab jetzt aufjedenfall mal die Datei Derby.jar gefunden und versuche diese wie wild in die verschiedensten Projekt Ordner reinzukopieren. Bis jetzt aber kein Erfolg.

Und wohin mit der Derby.jar Datei?
 

L-ectron-X

Gesperrter Benutzer
Das kommt darauf an, wie deine Manifest-Datei angelegt ist. In jedem Fall aber, muss sie in den Classpath gelegt werden.
Durch manuelle Modifikation derselben kannst du bspw. in der Zeile
Code:
Class-Path: Derby.jar
den relativen Pfad zur Derby-Bibliothek angeben. In dem obigen Beispiel würde sie neben deiner Programm-Jar im gleichen Verzeichnis liegen müssen.

Bei
Code:
Class-Path: lib/Derby.jar
würde sie in einem Verzeichnis lib unterhalb deiner Programm-Jar liegen müssen.

Normalerweise erledigt das aber deine IDE, wenn du ihr die Resourcen hinterlegst.
 

Kros

Mitglied
OK Danke für den Hinweis... hat aber leider noch nicht funktioniert.

Erstmal eine Verständnis Frage:
Normalerweise erledigt das aber deine IDE, wenn du ihr die Resourcen hinterlegst.
Wie sag ich das meiner IDE (NetBeans)?

Hab meine Derby.jar Datei nun wieder in jedes Verzeichnis hineinkopiert und die Manifest Datei von Hand ergänzt. Dies ergab keine Änderung.

würde sie in einem Verzeichnis lib unterhalb deiner Programm-Jar liegen müssen.

Hab meine Projekt-Jar nicht gefunden. Wird diese nicht erst erstellt, wenn das Prog kompiliert wird? Im moment habe ich nur class-Dateien. Und habe ich überhaupt die richtige Derby.jar Datei erwischt? Oder gibt es da verschiedene?
 

L-ectron-X

Gesperrter Benutzer
Erstmal eine Verständnis Frage:

Wie sag ich das meiner IDE (NetBeans)?
Dazu mal hier nachsehen: NetBeans externe Bibliotheken bekannt machen ? Byte-Welt Wiki

Hab meine Derby.jar Datei nun wieder in jedes Verzeichnis hineinkopiert und die Manifest Datei von Hand ergänzt. Dies ergab keine Änderung.
Du hast geschrieben, dass du deine Projekt-Jar nirgends findest. In dem Fall bringt natürlich auch das Kopieren der Derby.jar in sämtliche Verzeichnisse nichts.

Mein Vorschlag ging von einer fertig erzeugten Projekt-Jar aus. In dieser solltest du die Manifest-Datei manipulieren, wenn du das Ganze manuell erledigen möchtest.

Hab meine Projekt-Jar nicht gefunden. Wird diese nicht erst erstellt, wenn das Prog kompiliert wird?
Du erstellst dein Projekt mit Klick auf diesen Button:
l-ectron-x-albums-bilder-beitraegen-picture169-netbeans-build-button.gif

Die fertige Projekt-Jar findest du dann, gemeinsam mit eventuell angegebenen weiteren Resourcen, im dist-Verzeichnis deines Projektes.

Der Vollständigkeit halber auch noch der Link zum richtigen Verbinden mit Derby:
Datenbankverbindung (Java) - Derby ? Byte-Welt Wiki
 

Kros

Mitglied
Dazu mal hier nachsehen: NetBeans externe Bibliotheken bekannt machen ? Byte-Welt Wiki

Hier werden sie geholfen :). Ich danke dir.

Bin davon ausgegangen, dass man die Java DB nicht extra noch einbinden muss, da es sich um eine Klasse wie halt andere Klassen auch handelt.

Die eine von meinen beiden Klassen schafft jetzt die Verbindung, die andere führt noch immer zu exeption. Wieso das so ist, sollte ich nun selbst herausfinden können, indem ich die beiden Klassen vergleiche.

Wünsche ein schönes Wochenende
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Datenbankverbindung mit Maven konfigurieren Java Basics - Anfänger-Themen 11
E Datenbankverbindung/Preparedstatements Java Basics - Anfänger-Themen 1
I NullPointerException bei Datenbankverbindung Java Basics - Anfänger-Themen 5
T Datenbankverbindung Java Basics - Anfänger-Themen 16
K Datenbankverbindung prüfen Java Basics - Anfänger-Themen 4
Hatebreed Keine Datenbankverbindung, wieso? (ClassNotFoundEscpetion) Java Basics - Anfänger-Themen 18
J Datenbankverbindung klappt doch nicht? IBM DB2 Java Basics - Anfänger-Themen 2
A Probleme bei Datenbankverbindung Java Basics - Anfänger-Themen 3
G Sicherheit Datenbankverbindung Java Basics - Anfänger-Themen 6
K Datenbankverbindung mit OCI Java Basics - Anfänger-Themen 4
M Datenbankverbindung mit einem JTable Java Basics - Anfänger-Themen 4
N Datenbankverbindung Java Basics - Anfänger-Themen 3
P Classpath jdbc-Treiber kann nach export in jar-File nicht mehr geladen werden Java Basics - Anfänger-Themen 2
J Export als Jar mit ODBC-Treiber Java Basics - Anfänger-Themen 8
lenniii DB Basics (JDBC-Treiber) Java Basics - Anfänger-Themen 16
L db2jcc-Treiber installieren Java Basics - Anfänger-Themen 4
T Datenbank: Treiber nicht gefunden Java Basics - Anfänger-Themen 17
B JDBC Treiber lokal installieren ? Java Basics - Anfänger-Themen 2
M JDBC Treiber LGPL Java Basics - Anfänger-Themen 11
D JDBC Treiber unter dem Java Application Server Java Basics - Anfänger-Themen 6
B Java Treiber Java Basics - Anfänger-Themen 5
F Problem mit Treiber Java Basics - Anfänger-Themen 13
G Treiber ausgeben Java Basics - Anfänger-Themen 5
Butzibu Image Loader lädt nicht alle Bilder: Java Basics - Anfänger-Themen 4
J Java FTP Download lädt datein nicht Ordentlich herunter Java Basics - Anfänger-Themen 9
S Java Web Start lädt keine Bilder Java Basics - Anfänger-Themen 2
V Programm Lädt nicht mehr . Java Basics - Anfänger-Themen 7
T Warum lädt das Bild nicht? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben