Mysql
 sql >> Database >  >> RDS >> Mysql

Quando è necessario Class.forName per la connessione a un database tramite JDBC in un'app Web?

I driver JDBC4 includono un file:

META-INF/services/java.sql.Driver

nel jar che utilizza il meccanismo ServiceProvider per registrare l'implementazione del driver con la JVM (vedi javadocs per java.util.ServiceLoader ). Ecco perché Class.forName non è più necessario.

La mia ipotesi è che questo sia un problema del caricatore di classi. Il ServiceLoader javadoc afferma che:

Proverei a mettere il tuo driver in tomcat\lib directory anziché la directory dell'app Web per vedere se ciò fa la differenza (caricatore di classi diverso?).

Se avvii la tua app Web tramite un ide e imposti un punto di interruzione, una volta raggiunto il punto di interruzione, puoi utilizzare la funzione "valuta espressione" per eseguire:ServiceLoader.load(Driver.class) . Questo ti darà un ServiceLoader classe in cui puoi sbirciare per vedere quali Driver sono registrati. Puoi controllare se il driver mysql è presente, dove si trova nell'elenco, ecc., Il che potrebbe aiutare a capire il comportamento qui.