Где мне разместить драйвер 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 и нашел сообщение о том, что вам нужно добавить этот jar- файл в папку lib, если у вас более старая версия tomcat. Поэтому я добавил банку, и теперь она работает, но я хотел бы получить некоторую информацию о том, что происходит на земле, потому что я использую новейшую версию Tomcat. Так почему, когда я указываю фабрику, я получаю ошибку. И что это за баночка, которую я добавляю, и почему об этом очень мало документации? Любая информация о том, что здесь происходит, будет принята с благодарностью.

2 ответа

Решение

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

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

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

Нет точно документации, специально предназначенной для этой проблемы. Однако руководство по загрузке классов Tomcat поможет понять иерархию загрузки классов в Tomcat.

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

Смотрите также:

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

Другие вопросы по тегам