Laden eines JDBC Treiber.

Status
Nicht offen für weitere Antworten.

BlackReloaded

Aktives Mitglied
Hi,

ich habe ein hoffentlich kleines Problem mit meinem Prgoramm und zwar versuche ich einen Datenbank Treiber von Apachen ( Derby ) über einen Classloader zu laden.

Der Classloader selber funktioniert auch bestens:

Code:
static Object newInstance( String path, String classname ) throws Exception
	  {
	    URL url = new File( getLocation() + path ).toURI().toURL();

	    URLClassLoader cl = new URLClassLoader( new URL[]{ url } );

	    Class<?> c = cl.loadClass( classname );

	    return  c.newInstance();
	  }

Ich muss den Treiber über einen Classloader laden, da er nicht im CLASSPATH vorhanden ist.
Die Funktion getLocation() gibt den Absolutenppfad zum Prgorammverzeichnis.
Nun zum Problem:

Code:
Object a = KlassenLader.newInstance("Treiber/derby.jar", "org.apache.derby.jdbc.EmbeddedDriver");

// Wenn der Treiber in dem CLASSPATH liegen würde, läd man so den Treiber
// dies funktioniert auch.
//Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();

//Verbindung zur Datenbank aufbauen
connection = DriverManager.getConnection("jdbc:derby:database/system_dbs;create=true;");

Bei dem Verbindungsaufbau bekomme ich eine SQLException die mir sagt, dass der Treiber nicht geladen ist.

Kann mir vielleicht jemand helfen wo mein Fehler oder denk Fehler ist?

Ich wäre für jede Hilfe dankbar...

MFG

Marc Kohlbau

PS: Wenn ich den Klassloader an anderer Stelle nutze funktioniert auch alles wunderbar.
Hier noch ein Beispiel:
Code:
Object Look = KlassenLader.newInstance("Treiber/synthetica.jar", "de.javasoft.plaf.synthetica.SyntheticaStandardLookAndFeel");
UIManager.setLookAndFeel((LookAndFeel) Look);
 
G

Guest

Gast
Mal abgesehen davon, daß das Laden eines DB-Treibers von externen Quellen zur Laufzeit recht ungewöhnlich ist, dürfte die Lösung des Rätsels hierin bestehen:

http://java.sun.com/j2se/1.5.0/docs/api/java/sql/DriverManager.html

When the method getConnection is called, the DriverManager will attempt to locate a suitable driver from amongst those loaded at initialization and those loaded explicitly using the same classloader as the current applet or application.
 

BlackReloaded

Aktives Mitglied
Anonymous hat gesagt.:
Mal abgesehen davon, daß das Laden eines DB-Treibers von externen Quellen zur Laufzeit recht ungewöhnlich ist,(...)

Wieso ist das so ungewöhnlich? Dieser "Treiber" ist ja die komplette Datenbank und ich brauche sie in 3 Jar Archiven die ich ausliefere, wenn die den "Treiber" in jedem Archiv packen würde wäre das Projekt knapp 6 MB größer und das wollte ich mir/den Usern ersparen.

Vielen dank für die Hilfe, hatte auch in der Doku geguckt aber den satzt total überlesen :cry:

Jetzt ist nur die Frage wie man es hinbekommt, wenn nicht der gleiche Classloader genutzt wird.

Ich habe es so versucht, aber leider kein vortschritt:

Code:
DriverManager.registerDriver( (Driver) a);

Diese Zeile läuft auch ohne Exception, nur der Treiber ist trotzdem nicht vorhanden?

MFG
Marc Kohlbau
 
G

Guest

Gast
Da bisher niemand anderes geantwortet hat, antworte ich nochmal, obwohl ich mich auf dünem Eis bewege.
Du sagst, daß du die "komplette" DB in dem Jar auslieferst, also Treiber + Daten?

Das ist in der Tat ungewöhlich, da der Treiber eigentlich lokal vorliegt und die Datenbank zentral für die Clients bereitsteht. Vielleicht verstehe ich nicht so ganz was du vor hast oder damit bezecken willst.

Der Client muß den Treiber doch letztendlich sowieso "laden" ob jetzt mit der Installation oder bei jedem Start der Anwendung. ???:L

Zu der Classloader-Problematik kann ich auch nicht viel mehr zu sagen, außer daß der DriverManager eigentlich veraltet ist und man heutzutage DataSources benutzt. Diese bieten eventuell die Möglichkeit einen Treiber dynamisch zu landen aber das ist nur eine Vermutung.
 

BlackReloaded

Aktives Mitglied
Hi,
danke für die Antwort soweit.

Jedoch verstehe ich nicht, was daran ungewöhnlich sein soll? Mal ein paar zusatz infos:
Ich programmiere eine Buchhaltunssoftware für zu Hause.
Da ich nicht davon ausgehen kann, dass jeder User einen Server mit einem Datenbanksystem vorrätig hat und
ich nicht den User zumuten/vertraue einen Localen Server zu installieren, habe ich mich entschlossen
die Datenbank von Apache zu nutzen, diese heißt Derby.
Derby bringt den Vorteil mit, dass die komplette DB in Java geschrieben ist.

Diese Software ( Jarfile ) kann man entweder Local nutzen in dem man aus der Kompletten Jarfile, den oben genannten
Treiber Läd ( Der dann, so denke ich, die Datenbank Localstartet ), oder man Läd den Netzwerktreiber
(Weiß ich gerade nicht auswendig wie der heißt ).
Jedoch ist das alles eine geschlossene Jar-Datei ( knapp 4 MB groß), diese muss ich ja jetzt in meine Jar-Datei integrieren... und genau das wollte ich vermeiden, das ich sie 3 mal ausliefere.

MFG
Marc Kohlbau
 

kleiner_held

Top Contributor
Der DriverManager vergleicht den ClassLoader des Aufrufers mit dem des Drivers, deswegen klappt auch DriverManager.registerDriver() nicht.

Du brauchst den DriverManager meiner Meinung nach aber nicht wirklich.
Code:
Driver driver = (Driver) KlassenLader.newInstance("Treiber/derby.jar", "org.apache.derby.jdbc.EmbeddedDriver"); 
connection = driver.connect("jdbc:derby:database/system_dbs;create=true;", new Properties());
 
G

Gast

Gast
Hallo Marc und alle übrigen,

ich suche auch gerade nach einer Lösung, einen JDBC-Treiber zur Programm-Laufzeit zu laden - insofern klingt das mit dem Klassenlader interessant...

Mein Programm arbeitet momentan noch mit Class.forName(). Läuft alles soweit ganz gut, wenn ich den Treiber (testweise momentan mySQL) im JAR mit ausliefere - das gefällt mir aber eigentlich nicht. Ich würde die Anwendung lieber unabhängig von einer konkreten Datenbank gestalten - wer eine Oracle-DB hat, nimmt dann halt den Oracle-Treiber, usw. Das Anwendungsprogramm kriegt dann einen Dialog zum Einstellen des Treibers und der URL, User und Passwort etc. Ungewöhnlich finde ich das auch nicht - habe bisher hauptsächlich Delphi-Programme geschrieben und die DB-Anbindung dann über ODBC eingerichtet. Die ODBC-DSN richtet dann der Kunde mit dem passenden DB-Treiber ein, das Anwendungsprogramm benutzt die ODBC-DSN. Hmm - und jetzt in Java? (Über die ODBC-JDBC-Schiene will ich nicht gehen, das klingt umständlich).

Lange Rede, kurze Frage: Funktioniert der zuletzt gepostete Code?
Oder gibt es für die beschriebene Anwendung einen besseren (üblicheren) Weg in Java?

Danke schonmal,
Sabine.
 
G

Gast

Gast
Hat sich erledigt, funktioniert jetzt bei mir über den Klassenlade (Code wie oben).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Sample Database in Postgres laden Datenbankprogrammierung 5
ruutaiokwu SQL-Dump nach MariaDB laden? Datenbankprogrammierung 6
G PostgreSQL Treiber laden schlägt fehl wegen: "... passwortbasierte Authentifizierung ..." Datenbankprogrammierung 2
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
M Kann Oracle Datenbanktreiber nicht laden Datenbankprogrammierung 5
M H2 Laden der H2-Treiber schlägt fehl Datenbankprogrammierung 2
trash Dynamische SQL Inhalte laden?! Datenbankprogrammierung 6
E MySQL Treiber aus NetBeans laden Datenbankprogrammierung 13
H Datenbank in Datei speichern / laden Datenbankprogrammierung 8
S MySQL Abfrage in showInputDialog laden Datenbankprogrammierung 6
C Treiber laden Datenbankprogrammierung 4
QDog JPA: Entity "laden" und später updaten Datenbankprogrammierung 4
H Konnte den Treiber com.mysql.jdbc.Driver nicht laden. Datenbankprogrammierung 19
A Problem beim Laden des Treibers Datenbankprogrammierung 5
Y Hibernate - Werte aus 2 Tabellen laden Datenbankprogrammierung 29
G Probleme mit Laden des JDBC-Treiber in HSQLDB Datenbankprogrammierung 2
P [Hibernate] Objekt laden, Id ändern und speichern? Datenbankprogrammierung 2
M "SQL - Apache" Problem beim laden des Applets Datenbankprogrammierung 4
A Datenbankzugriff per Applet - Problem beim Treiber laden Datenbankprogrammierung 6
V JDBC Treiber laden Datenbankprogrammierung 2
E Problem beim laden des JDBC Driver bzw der Database Datenbankprogrammierung 8
B double Array in MySQL Datenbank speichern/laden Datenbankprogrammierung 12
R Servlet, kann nicht den Treiber laden Datenbankprogrammierung 4
T Treiber laden PostgreSQL Datenbankprogrammierung 3
W Hibernate: Komplette Datenbank in Speicher laden? Datenbankprogrammierung 5
A ClassNotFoundException beim Laden des Oracle-JDBC-Treibers Datenbankprogrammierung 10
Robert Zenz Aufteilen von Up/Downvotes eines Benutzers in drei Gruppen. Datenbankprogrammierung 0
H Oracle Resize eines Images in Java und Rückgabe des Image als BLOB an die Oracle Datebank Datenbankprogrammierung 14
damike84 Hibernate: persistieren eines Graphen Datenbankprogrammierung 2
G Laufzeit eines Algorithmus mittels Big Theta bestimmen Datenbankprogrammierung 5
G ID zuweisung eines TerminKalenders (mehrere Kalender) Datenbankprogrammierung 8
D Hibernate: Zustand eines Objekts erkennen? Datenbankprogrammierung 0
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
J Datenbankeintag eines Warenkorbes funktioniert nicht Datenbankprogrammierung 4
H MySQL Werte eines Datensatzes in einen anderen kopieren Datenbankprogrammierung 2
M [Hibernate]Abgleich eines lokalen Objekts mit dem Zustand aus der Datenbank. Datenbankprogrammierung 3
N Problem bei Erstellung eines Index Datenbankprogrammierung 12
G PostgreSQL Postgre: Passwort eines Benutzers ändern Datenbankprogrammierung 3
D Anzeige wärend des Ausführens eines Statements Datenbankprogrammierung 13
N executeUpdate "innerhalb" eines Resultsets Datenbankprogrammierung 14
S Select eines bestimmten Datensatzes Datenbankprogrammierung 4
J Kopieren eines Datensatzes Datenbankprogrammierung 4
R Effiziente Java-Methode zum finden eines freien PK Datenbankprogrammierung 7
M Zugriff auf eine Access-Datenbank innerhalb eines jar-Files Datenbankprogrammierung 7
brainray Bei MySQL alle Datenbanken eines Servers abfragen Datenbankprogrammierung 3
1 User die Rechte eines Datenbankerstellers zuweisen? Datenbankprogrammierung 3
X SQL Abfrage für Ähnlichkeit eines Strings Datenbankprogrammierung 2
B SQL Abfrage. Nur den ersten eines Blocks Datenbankprogrammierung 2
M Passwort eines Technischen Users hinterlegen Datenbankprogrammierung 6
A JPA: Zweite Instanz eines Entitätsobjekts Datenbankprogrammierung 3
M Konvertierung eines Ojects to String Datenbankprogrammierung 3
T Datenbanknamen eines Datenbankservers auslesen Datenbankprogrammierung 9
J Größe eines ResultSets Datenbankprogrammierung 12
G Problem beim Schreiben eines Dateipfads in MySQL-DB Datenbankprogrammierung 9
G Löschen eines Eintrages verbunden mit JList Datenbankprogrammierung 5
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
W Anzahl der Spalten eines ResultSets bestimmen Datenbankprogrammierung 5
F die DN eines LDAP verzeichnisses abfragen Datenbankprogrammierung 2
N Struktur eines Datenbankinterface? Datenbankprogrammierung 7
P Wirkliche Zeilenanzahl eines ResultSets ermitteln Datenbankprogrammierung 22
K frage zum ausführen eines INSERT statements Datenbankprogrammierung 16
K errechnen eines mittelwertes vom jdbc rSet Datenbankprogrammierung 4
M Abfrage trennt Ergbnis eines Atrributes nach den Leerzeichen Datenbankprogrammierung 4
F Abfrage eines DB Feldes aus einer mySQL Datenbank Datenbankprogrammierung 2
K Datenbank eines Forums nutzen Datenbankprogrammierung 11
J Alle Spalten und Zeilen eines ResultSets ausgeben ? Datenbankprogrammierung 2
B Zeilenzahl eines ResultSet ermitteln Datenbankprogrammierung 5
B SQLite + jdbc + IntelliJ-Consumer = "No suitable driver found..." Datenbankprogrammierung 15
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
N JDBC SQLITE und Cascading Datenbankprogrammierung 2
D Asynchrone Aufrufe mit jdbc Datenbankprogrammierung 5
Edin JDBC Hilfe Datenbankprogrammierung 2
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Husamoli345 JSF-JDBC Verbindung Crud Datenbankprogrammierung 15
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
N Java, sql, jar, JDBC-Treiber in Classpath Datenbankprogrammierung 8
O Create Table per JDBC Fehler: ORA-00922 Datenbankprogrammierung 4
J JDBC anschaulich präsentieren Datenbankprogrammierung 2
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
ralfb1105 Oracle JDBC Debugging Datenbankprogrammierung 8
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
B MySQL JDBC Kommentarfilter Datenbankprogrammierung 4
Aruetiise MySQL Name JDBC Drive finden Datenbankprogrammierung 4
E Sqlite-jdbc Mitliefern Datenbankprogrammierung 4
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
S probleme mit dem jdbc treiber Datenbankprogrammierung 1
Thallius MySQL Merkwürdiges JDBC Verhalten bei VPN Verbindung. Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
F MySQL JDBC Problem Datenbankprogrammierung 5
C JDBC und SQLite Datenbank Datenbankprogrammierung 8
looparda SQLite Active JDBC Abstraktion Datenbankprogrammierung 2
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
J RESTServie + JDBC + No suitable driver found for jdbc Datenbankprogrammierung 4
KaffeeFan JDBC/ODBC-Bridge entfernt Datenbankprogrammierung 4
S sun.jdbc.odbc.JdbcOdbcDriver wird nicht gefunden Datenbankprogrammierung 2
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
A Mit JDBC auf postgreSQL Datenbank zugreifen Datenbankprogrammierung 5
C PostgreSQL JDBC + PostgreSQL: getLong liefert 0 statt NULL Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben