tomcat - para - sqljdbc4.jar sql server 2017
¿Por qué el controlador JDBC debe colocarse en la carpeta TOMCAT_HOME/lib? (1)
Tengo un problema extraño en el que dos aplicaciones web con el controlador Oracle JDBC entran en conflicto entre sí. Tengo que poner el JAR del controlador JDBC en la carpeta común TOMCAT_HOME / lib . ¿Cuál es la razón para esto?
Los controladores JDBC se registran en el DriverManager
único de JVM que comparten todas las aplicaciones web. Si tiene el mismo controlador JDBC (como en el nombre de su clase), regístrese dos veces desde dos aplicaciones web diferentes, esto podría causarle problemas. Esto es aún más problemático si sus aplicaciones web usan versiones diferentes del mismo controlador JDBC.
Además, colocar los controladores JDBC en la carpeta lib de Tomcat ayudará a evitar fugas de memoria cuando vuelva a implementar su aplicación web sin reiniciar Tomcat, por ejemplo, si acaba de colocar un nuevo archivo WAR en la carpeta webapps de Tomcat:
La clase DriverManager
es cargada por el cargador de clases bootstrap y por lo tanto "vive" globalmente en la JVM, mientras que Tomcat carga todas las aplicaciones web en sus propios cargadores de clases. Entonces, si un controlador JDBC de la carpeta WEB-INF / lib de una aplicación web se registra en DriverManager
, fija el cargador de clases de esa aplicación web en la memoria (y por lo tanto todas las clases de esa aplicación web), evitando su recolección de basura.
Si, en cambio, los controladores DriverManager
y JDBC provienen de cargadores de clases de aplicaciones no web, puede volver a implementar libremente sus aplicaciones web sin que ninguna clase de aplicación web se fije en clases cargadas desde otros cargadores de clases.
Las versiones actuales de Tomcat (probablemente 6.x y definitivamente 7.x) registrarán las advertencias en el despliegue de una aplicación web si se detecta una fuga de memoria, entre otras cosas, por los controladores JDBC.