Perché il driver JDBC deve essere inserito nella cartella TOMCAT_HOME / lib?

Ho uno strano problema in cui due applicazioni web con driver JDBC Oracle entrano in conflitto tra loro. Devo inserire il driver JDBC JAR nella cartella comune TOMCAT_HOME / lib . Qual è la ragione di questo?

I driver JDBC si registrano nel DriverManager Singleton a livello JVM condiviso da tutte le app Web. Se si ha lo stesso (come nel nome della class) del driver JDBC registrato due volte da due diverse app Web, ciò potrebbe causare il problema. Ciò è ancora più problematico se le tue app Web utilizzano versioni diverse dello stesso driver JDBC.

Inoltre, inserendo i driver JDBC nella cartella lib di Tomcat, è ansible evitare perdite di memoria quando si ridistribuisce l’app Web senza riavviare Tomcat, ad esempio se si inserisce un nuovo file WAR nella cartella webapps di Tomcat:

La class DriverManager viene caricata dal programma di caricamento di class bootstrap e quindi “vive” globalmente nella JVM, mentre Tomcat carica tutte le app Web nei propri programmi di caricamento classi. Quindi, se un driver JDBC dalla cartella WEB-INF / lib dell’applicazione Web si registra in DriverManager , blocca il programma di caricamento classi dell’app Web in memoria (e quindi tutte le classi di tale app Web), evitando la sua garbage collection.

Se invece i driver DriverManager e JDBC provengono da classloader di app non Web, è ansible ridistribuire liberamente le proprie app Web senza alcuna class di app Web che si impegna in classi caricate da altri classloader.

Le versioni correnti di Tomcat (probabilmente 6.xe definitivamente 7.x) registreranno gli avvisi in caso di annullamento della distribuzione di un’app Web se viene rilevata una perdita di memoria, tra l’altro dai driver JDBC.