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