Где я должен разместить драйвер JDBC для пула соединений Tomcat?

Итак, я выяснил свою ошибку, теперь я просто ищу информацию о том, что происходит точно. Я использую Apache Tomcat версии 7.0.32. Я использую этот учебник для настройки пула для JDBC. В моей папке META-INF я создал файл context.xml и поместил ее там.

<?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>

Я получил эту ошибку, когда написал это

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

Эта ошибка возникает только тогда, когда у меня есть этот оператор в моем файле context.xml. Когда я удаляю его без ошибок.

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

Причина, по которой я хочу убедиться, что у меня есть это, потому что в учебнике apache tomcat говорится

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

Итак, я сделал небольшое исследование SO и нашел сообщение о том, что вам нужно добавить эту банку в вашу папку lib, если у вас есть более старая версия tomcat. Поэтому я добавил банку, и теперь она работает, но я хотел бы получить некоторую информацию о том, что происходит на земле, потому что я использую новейшую версию tomcat. Так почему, когда я указываю factory, я получаю сообщение об ошибке. И что это за банку, которую я добавляю, и почему в ней очень мало документации? Любая информация о том, что здесь происходит, будет с благодарностью.

Ответ 1

Драйвер JDBC должен быть видимым для того же загрузчика классов, что и сам источник данных factory. Библиотека источника данных factory размещается в собственной папке /lib Tomcat и, таким образом, загружается Tomcat "общим" загрузчиком классов.

Ваша проблема звучит так же, как вы уронили драйвер JDBC в webapp /WEB-INF/lib. Webapp /WEB-INF/lib невидим для "общего" загрузчика классов. Технически вам необходимо разместить драйвер JDBC в собственной папке /lib Tomcat (или, по крайней мере, в настраиваемом пути, указанном параметром common.loader в /conf/catalina.properties), чтобы сделать его видимым для источника данных factory.

Или, как вы пытались, копирование источника данных factory в /WEB-INF/lib также исправит его. Webapp /WEB-INF/lib имеет более высокий приоритет при загрузке классов, чем папка Tomcat /lib. Поэтому, если источник данных factory находится в /WEB-INF/lib, он будет загружен оттуда. Поскольку драйвер JDBC также присутствует, это будет видно. Это, однако, не является правильным решением вашей конкретной проблемы, это скорее обходной путь, поэтому вы не должны этого делать.

Существует не совсем документация, специально предназначенная для этой проблемы. Tomcat Class Loader HOW-TO, однако, поможет понять иерархию загрузки классов в Tomcat.

Снимок экрана, показывающий папку Tomcat с вложенной

См. также:

Ответ 2

У меня была та же проблема, ваше решение не сработало для меня. Мне пришлось добавить файл mysql-connector-java-5.1.30-bin.jar в мою папку lib, чтобы он работал, поскольку я использовал этот драйвер:) Приветствия.