ClassLoader - dymisches Laden von JDBC Drivers

Status
Nicht offen für weitere Antworten.

chearius

Mitglied
Hallo! In meiner Java-Anwendung kann der Benutzer sich aussuchen mit welcher Datenbank er sich verbinden will. Wenn die Treiber-Klasse in ClassPath ist, läuft alles in Ordnung, die Verbindung kann problemlos hergestellt werden. Wenn die Treiber-Klasse nicht in ClassPath ist, erscheint ein Dialog, in dem eine JAR-Datei mit dem Treiber auszuwählen ist. Mittels URLClassLoader kann der JDBC-Treiber geladen werden, aber wenn ich dann Versuche eine SQL-Verbindung herzustellen, kommt ein Fehler.

Code:
URLClassLoader jcl = new URLClassLoader(new URL[] {jarFile.toURL()});
Driver d = (Driver) Class.forName(driver, true, jcl).newInstance();
DriverManager.registerDriver(d);
DriverManager.getConnection(url);
....

Es kommt folgender Fehler:
Code:
java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager.java:545)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at de.uni_karlsruhe.stud.uabqk.kim.utilities.pseudo.DatabaseUtils.initializeDBPool(DatabaseUtils.java:29)

Gibst eine Möglichkeit die JDBC-Treiber-Klassen dynamisch zu laden?

Danke für Hilfe!

Chearius
 

KSG9|sebastian

Top Contributor
übergib mal den URL ClassLoader als zweiten Parameter noch den Default(Parent)-Classloader.
Zusätzlich musst du die Klasse ja auch noch laden.

Code:
URLClassLoader urlc = new URL.....
Class driverClass = urlc.loadClass(driver);

und dann noch folgendes:

Code:
Class.forName(driverClass);
Connection con = DriverManager.getConnection("url", "user", "pass");

P.S.: Du bist in Karlsruhe auf der UNI ?
 

chearius

Mitglied
Hallo! Danke für Deine Antwort, aber es hat leider nicht geholfen, ... - Der DriverManager sagt immer, dass er keinen Treiber finden kann :bahnhof:. Ich habe am Wochende verschiedenes versucht, bin leider nicht zum Ziel gekommen. In der GUI-Anwendung habe ich folgende funktion selectDriverJar - die wird nur dann ausgefühtr, wenn der Treiber nicht im ClassPath ist:
Code:
private void selectDriverJar() {
	File jarFile = null;
	
	JFileChooser jfc = new JFileChooser();
	jfc.setFileFilter(new JarFileFilter());
	int result = jfc.showOpenDialog(this);
	if (result == JFileChooser.APPROVE_OPTION) {
		jarFile = jfc.getSelectedFile();
	}
		
	try {
		URLClassLoader jcl = new URLClassLoader(new URL[] {jarFile.toURL()}, MainDialog.class.getClassLoader());
		jcl.loadClass(databaseDriver.getText());
		Class.forName(databaseDriver.getText(), true, jcl);
		DatabaseUtils.initializeDBPool(jcl, databaseDriver.getText(), databaseURL.getText(), 
                             databaseUser.getText(), new String(databasePassword.getPassword()));
		fetchDatabaseInfo();
	} catch (Exception ex) {
		JOptionPane.showMessageDialog(this, strings.getObject("error.dbdriver"));
		ex.printStackTrace(System.out);
		System.exit(1);
	}
}
Nach dem ich dasJAR-Archiv mit dem Treiber selektiere, kann der URLClassLoader die Treiber-Klasse (ich habe org.postgresql.Driver getestet) ohne Probleme laden. Das Problem entsteht erst in der Funktion initializeDBPool.

Die Funktion DatabaseUtils.initializeDBPool sieht so aus:
Code:
public static void initializeDBPool(ClassLoader cl, String driver, 
    String url, String user, String pwd) throws Exception {
	cl.loadClass(driver);
	Driver d = (Driver) Class.forName(driver, true, cl).newInstance();
	DriverManager.registerDriver(d);
	conn = DriverManager.getConnection(url, user, pwd);
		
//	ds = new ComboPooledDataSource();
//	ds.setDriverClass(driver);
//	ds.setJdbcUrl(url);
//	ds.setUser(user);
//	ds.setPassword(pwd);
//	ds.setMinPoolSize(1);
//	ds.setMaxPoolSize(20);
//		ds.setAcquireIncrement(5);
}

Also wie gesagt, ist der Treiber in ClassPath, dann funtioniert alles.

Sorry, dass ich mit diesem störe, aber ich kann das Problem nicht selber lösen :bahnhof:

Danke für Eure Tips!

Marek AKA Chearius

P.S. (KSG9|sebastian) Ja ich studiere an der Uni in Karlsruhe (Physik) :+)
 
G

gast

Gast
ich hatte heute das gleiche problem...konnte es aber lösen (hab auch tierisch zeit verbraten)

Lösung:

Dein code:
---------------
Code:
URLClassLoader jcl = new URLClassLoader(new URL[] {jarFile.toURL()});
Driver d = (Driver) Class.forName(driver, true, jcl).newInstance();
DriverManager.registerDriver(d);
DriverManager.getConnection(url);
--------------

wenn du mit DriverManager.getConnection(url) die Verbindung aufbauen willst, dann nimmt der DriverManager nicht deinen URLClassLoader, welchem ja dein jar file bekannt ist und er die klasse schon geladen hat. Stattessen den ClassLoader System ClassLoader.
Ich hab mir einfach den DriverManager kopiert als MyDriverManager und dann allen methoden getConnection( .. ) noch als parameter ClassLoader mitgegeben. In der Methode selber nutze ich dann diesen Classloader ( In deinem Fall der URLClassLoader, denn du mit übergibst )
Einfach von DriverManager erben und methoden überschreiben geht leider nicht, da der Konstruktur privat ist.

Ich hoffe es funktioniert auch bei dir.

gruß wako
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
D Classloader ohne Package Allgemeine Java-Themen 10
N Klasse via ClassLoader laden Allgemeine Java-Themen 2
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
K [Refactoring] ClassLoader Verzeichnis durchsuchen lassen Allgemeine Java-Themen 7
schlingel Webstart/Applet Problem - Classloader-Bug Allgemeine Java-Themen 7
M Security Manager für bestimmte Klassen/Classloader? Allgemeine Java-Themen 3
hdi ClassLoader / Constructor Call intern Allgemeine Java-Themen 11
C inteface not visible from classloader Allgemeine Java-Themen 2
M jdbc treiber (h2) mit eigenem ClassLoader laden Allgemeine Java-Themen 4
B Eigener ClassLoader Allgemeine Java-Themen 9
MQue ClassLoader Pfad ausgeben Allgemeine Java-Themen 6
S Problem mit ClassLoader.getSystemResource !! Allgemeine Java-Themen 3
V Image laden - URL über ClassLoader ermitteln Allgemeine Java-Themen 2
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
E Wieder mal der Classloader Allgemeine Java-Themen 6
F ClassLoader und "Cache" Allgemeine Java-Themen 2
MQue ClassLoader Allgemeine Java-Themen 5
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
P System.getProperty zu Classloader Allgemeine Java-Themen 21
G Classloader Problem Allgemeine Java-Themen 10
M Bibliotheksname zur Laufzeit ermitteln (Classloader) Allgemeine Java-Themen 7
MQue ClassLoader Allgemeine Java-Themen 18
G Problem mit URL classloader Allgemeine Java-Themen 10
S classloader + jar + resourcen in dem jar Allgemeine Java-Themen 4
F mit classloader klassen ausserhalb *.jar einlesen Allgemeine Java-Themen 4
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
T ClassLoader und Zugriff auf unbekannte Klassen Allgemeine Java-Themen 5
R Problem mit Classloader Allgemeine Java-Themen 2
D Programm mit eigenem ClassLoader funktioniert nicht Allgemeine Java-Themen 12
K Problem mit ClassLoader - Laden von Resourcen aus Jar's Allgemeine Java-Themen 14
C Problem mit ClassLoader Allgemeine Java-Themen 2
T Brauche Hilfe bei ClassLoader Allgemeine Java-Themen 2
G cachender ClassLoader u.v.m. Allgemeine Java-Themen 5
G ClassLoader Allgemeine Java-Themen 3
R ClassLoader funktioniert in Verbindung mit JAR-Datei nicht Allgemeine Java-Themen 8
O Maven ein externes jar laden ohne die Applikation neu zu kompilieren Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
Tobero .jar Dateine aus einem Ordner laden (Java 16) Allgemeine Java-Themen 5
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
L Jar Dateien in Classpath laden ab JDK 9+ Allgemeine Java-Themen 11
C Wav-Datei aus Jar laden? Allgemeine Java-Themen 11
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
H Objekt speichern und laden Allgemeine Java-Themen 1
I Klassen aus Jar-Dateien aus anderem Ordner laden Allgemeine Java-Themen 3
F Arraylist vollständig abspeichern und laden Allgemeine Java-Themen 1
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
I Laden von Informationen aus Dateien: Austauschbarkeit: 2 Dateien sinnvoll? Allgemeine Java-Themen 2
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
B Von String zu <Objekt> ||Speichern/Laden Allgemeine Java-Themen 17
Developer_X Website HTML Code von HTTPS URL laden Allgemeine Java-Themen 0
L Seite einer Partner Website neu laden Allgemeine Java-Themen 1
RalleYTN Audiolänge einer MP3 Datei erhalten ohne diese vollständig zu laden Allgemeine Java-Themen 15
S Maven Jars dynamisch laden / Plugin-Struktur erstellen Allgemeine Java-Themen 14
X Klassen aus jar in jar Laden Allgemeine Java-Themen 1
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
L Mapdaten laden Allgemeine Java-Themen 10
B Aktuellen Sourcecode aus Browser laden Allgemeine Java-Themen 43
HoloYoitsu Kann .dll nur aus Eclipse heraus laden Allgemeine Java-Themen 7
F Teil eines Bildes laden Allgemeine Java-Themen 1
L JavaFX JavafX externe FXML laden? Allgemeine Java-Themen 4
M Eine Datei im Speicher erneut laden(?) Allgemeine Java-Themen 1
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Allgemeine Java-Themen 3
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
F Java Native/Shared Library (.so) laden macht Probleme Allgemeine Java-Themen 3
V Input/Output Sound Dateien aus Jar laden Allgemeine Java-Themen 18
V Input/Output Gif Bilder Animiert aus einer Jar laden Allgemeine Java-Themen 4
V Input/Output Swing Icons in Jar Archiv laden Allgemeine Java-Themen 10
C BufferedImages in Jar laden. Allgemeine Java-Themen 1
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
Developer_X Input/Output Serialisiertes Objekt speichern und laden Allgemeine Java-Themen 1
J Arraylist speichern und laden? Allgemeine Java-Themen 5
S Applet in html laden; InvocationTargetException,.. nur warum ? Allgemeine Java-Themen 0
M Klassen Klasse Dynamisch laden und Konstruktor aufrufen Allgemeine Java-Themen 1
A Anderes Fenster neu laden Allgemeine Java-Themen 16
N Daten aus Jar laden Allgemeine Java-Themen 10
antonbracke Aus Jar eine Class laden und damit arbeiten! Allgemeine Java-Themen 5
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
A Class Datei aus Verzeichnis über URLClassLoader laden Allgemeine Java-Themen 2
A mit getClassLoader Bild laden Allgemeine Java-Themen 8
S Speichern/Laden/Hinzufügen/Löschen der Array-Wörter; unerwartete Ausgabe Allgemeine Java-Themen 6
G Native Library / Fehler beim Laden der .so/.dll Datei Allgemeine Java-Themen 17
antonbracke Klassen Klassen gegenseitig laden Allgemeine Java-Themen 4
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
T Java Klassen aus externer .jar laden und ausführen Allgemeine Java-Themen 3
P Textdatei aus Ressourcen laden. Allgemeine Java-Themen 8
R Java Array speichern & laden Allgemeine Java-Themen 23
N Input/Output Bild von WebSite laden? Allgemeine Java-Themen 3
G Interface Laden der Konfiguration über Interfaces sinnvoll? Allgemeine Java-Themen 28
Z Bilder aus JAR laden Allgemeine Java-Themen 2
D Ressourcen(config) laden Allgemeine Java-Themen 11
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben