¿Dónde debo colocar el controlador JDBC para el conjunto de conexiones de Tomcat?

Así que he descubierto mi error, ahora solo estoy buscando información sobre lo que está sucediendo exactamente. Estoy usando Apache Tomcat Version 7.0.32. Estoy usando este tutorial para configurar el pooling para JDBC. En mi carpeta META-INF hice un archivo context.xml y lo coloqué allí.

    

Obtuve este error cuando escribí esto

 WARNING: Unexpected exception resolving reference java.sql.SQLException: com.mysql.jdbc.Driver at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:631) at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:485) at org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:143) at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116) at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103) at org.apache.tomcat.jdbc.pool.DataSourceFactory.createDataSource(DataSourceFactory.java:539) at org.apache.tomcat.jdbc.pool.DataSourceFactory.getObjectInstance(DataSourceFactory.java:237) at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:143) at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304) at org.apache.naming.NamingContext.lookup(NamingContext.java:843) at org.apache.naming.NamingContext.lookup(NamingContext.java:154) at org.apache.naming.NamingContext.lookup(NamingContext.java:831) at org.apache.naming.NamingContext.lookup(NamingContext.java:168) at org.apache.catalina.core.NamingContextListener.addResource(NamingContextListener.java:1061) at org.apache.catalina.core.NamingContextListener.createNamingContext(NamingContextListener.java:671) at org.apache.catalina.core.NamingContextListener.lifecycleEvent(NamingContextListener.java:270) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5173) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:680) Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader$1.run(URLClassLoader.java:202) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:247) at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) ... 29 more Oct 31, 2012 11:23:25 AM org.apache.catalina.core.NamingContextListener addResource WARNING: Failed to register in JMX: javax.naming.NamingException: com.mysql.jdbc.Driver Oct 31, 2012 11:23:25 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8086"] Oct 31, 2012 11:23:25 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-bio-8009"] Oct 31, 2012 11:23:25 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 794 ms 

Este error solo aparece cuando tengo esta statement en mi archivo context.xml. Cuando lo elimino no hay error.

 factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

La razón por la que quiero asegurarme de que la tengo es porque en el tutorial de apache tomcat dice

 factory is required, and the value should be org.apache.tomcat.jdbc.pool.DataSourceFactory 

Entonces hice un poco de investigación sobre SO y encontré una publicación que decía que necesitas agregar este jar a tu carpeta lib si tienes una versión anterior de tomcat. Así que agregué el tarro y ahora funciona, pero me gustaría tener algo de información sobre qué sucede porque estoy usando la versión más nueva de tomcat. Entonces, ¿por qué cuando especifico una fábrica obtengo un error? ¿Y qué es esta jarra que agrego y por qué hay muy poca documentación al respecto? Cualquier información sobre lo que está sucediendo aquí sería muy apreciada.

El controlador JDBC debe estar visible para el mismo cargador de clases que la fábrica de origen de datos. La biblioteca de la fábrica de fonts de datos se coloca en la carpeta /lib de Tomcat y, por lo tanto, se carga mediante el cargador de clases “común” de Tomcat.

Su problema suena muy parecido a que dejó caer el controlador JDBC en webapp /WEB-INF/lib . El webapp /WEB-INF/lib es invisible para el cargador de clases “común”. Así que, técnicamente, debe colocar el controlador JDBC en la carpeta /lib propia de Tomcat (o, al menos, en una ruta configurable como se especifica en la configuración de /conf/catalina.properties en /conf/catalina.properties ) para que sea visible para los datos fuente de fábrica.

O, como lo intentó, copiar la fábrica de origen de datos en /WEB-INF/lib también lo arreglará. La webapp /WEB-INF/lib tiene una prioridad mayor en la carga de clases que la carpeta /lib de Tomcat. Entonces, si la fábrica de la fuente de datos se encuentra en /WEB-INF/lib , se cargará desde allí. Como el controlador JDBC también está allí, se verá. Sin embargo, esta no es la solución correcta para su problema concreto, esto es más una solución, por lo que no debería hacer esto.

No hay exactamente documentación específicamente dirigida a este tema. Sin embargo, el Tomcat Class Loader HOW-TO ayudará a comprender la jerarquía de carga de clases en Tomcat.

captura de pantalla que muestra la carpeta Tomcat con la carpeta anidada

Ver también:

  • La infame java.sql.SQLException: no se encontró un controlador adecuado
  • ¿Cómo debo conectarme a la base de datos / fuente de datos JDBC en una aplicación basada en servlet?
  • ¿Es seguro usar una instancia java.sql.Connection estática en un sistema multiproceso?

Tuve el mismo problema, tu solución no funcionó para mí. Tuve que agregar el archivo ‘mysql-connector-java-5.1.30-bin.jar’ a mi carpeta lib para que funcionara, ya que estaba usando ese controlador 🙂 Saludos.