web-dev-qa-db-ja.com

Tomcatの接続プールのJDBCドライバーはどこに配置する必要がありますか?

だから、私は自分のエラーを理解しました、今は正確に何が起こっているかについての洞察を探しています。 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について少し調査を行い、古いバージョンを持っている場合は this jar をlibフォルダーに追加する必要があるという投稿を見つけました。 Tomcat:jarを追加して動作するようになりましたが、最新のTomcatバージョンを使用しているので、一体何が起こっているのかについての情報が欲しいのですが、なぜ工場を指定するとエラーが発生しますか?私が追加するこのjarとは何ですか、またそれについてのドキュメントがほとんどないのはなぜですか?ここで何が起こっているかについての情報は大歓迎です。

27
gmustudent

JDBCドライバーは、データソースファクトリー自体と同じクラスローダーに表示される必要があります。データソースファクトリライブラリは、Tomcatの/libフォルダーに配置されているため、Tomcatの「共通」クラスローダーによってロードされます。

あなたの問題は、webappの/WEB-INF/libにJDBCドライバーを落としたように聞こえます。 webappの/WEB-INF/libは、「共通」クラスローダーには見えません。そのため、技術的には、JDBCドライバーをTomcatの/libフォルダー(または、少なくとも、common.loader/conf/catalina.properties設定で指定された構成可能なパス)に配置する必要がありますデータソースファクトリに表示されます。

または、試みたように、データソースファクトリを/WEB-INF/libにコピーすることでも修正されます。つまり、webappの/WEB-INF/libは、Tomcatの/libフォルダーよりもクラスロードの優先度が高くなっています。したがって、データソースファクトリが/WEB-INF/libで見つかった場合、そこからロードされます。 JDBCドライバーも存在するため、表示されます。ただし、これは具体的な問題の正しい解決策ではありません。これは回避策であるため、これを行うべきではありません。

この問題を特に対象としたドキュメントはありません。 Tomcat Class Loader HOW-TO は、Tomcatのクラス読み込み階層を理解するのに役立ちます。

screen shot showing Tomcat folder with nested "lib" folder with nested JDBC driver .jar file

こちらもご覧ください:

60
BalusC

私は同じ問題を抱えていた、あなたの解決策は私のために機能しませんでした。 「mysql-connector-Java-5.1.30-bin.jar」ファイルをlibフォルダーに追加する必要がありました。そのドライバーを使用していたためです:)乾杯。

0
Vasile Surdu