java - libreria - ¿Dónde debo colocar el controlador JDBC para el conjunto de conexiones de Tomcat?
sqljdbc4-4.0.jar download (2)
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 fuentes 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.
Ver también:
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í.
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource type="javax.sql.DataSource" name="jdbc/gmustudent"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/official"
username="root" password="root"
maxActive="100" maxIdle="20" minIdle="15" initialSize="15" maxWait="10000" />
</Context>
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.<init>(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 declaración 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.
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.