Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wann wird Class.forName benötigt, wenn eine Verbindung zu einer Datenbank über JDBC in einer Web-App hergestellt wird?

JDBC4-Treiber enthalten eine Datei:

META-INF/services/java.sql.Driver

in der JAR-Datei, die den ServiceProvider-Mechanismus verwendet, um die Treiberimplementierung bei der JVM zu registrieren (siehe Javadocs für java.util.ServiceLoader ). Deshalb Class.forName ist nicht mehr erforderlich.

Meine Vermutung ist, dass dies ein Problem mit dem Klassenlader ist. Der ServiceLoader javadoc erwähnt das:

Ich würde versuchen, Ihren Treiber in die tomcat\lib einzufügen Verzeichnis statt Ihres Web-App-Verzeichnisses, um zu sehen, ob das einen Unterschied macht (anderer Klassenlader?).

Wenn Sie Ihre Web-App über eine IDE starten und einen Haltepunkt festlegen, können Sie nach dem Erreichen des Haltepunkts die Funktion "Ausdruck auswerten" verwenden, um Folgendes auszuführen:ServiceLoader.load(Driver.class) . Dadurch erhalten Sie einen ServiceLoader Klasse, in der Sie einen Blick darauf werfen können, welche Fahrer registriert sind. Sie können überprüfen, ob der mysql-Treiber vorhanden ist, wo er sich in der Liste befindet usw., was beim Ermitteln des Verhaltens hier hilfreich sein könnte.