28

だから私は自分のエラーを理解しました、今私は正確に何が起こっているのかについての洞察を探しています。ApacheTomcatバージョン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" 

私がそれを持っていることを確認したい理由は、apachetomcatチュートリアルでそれが言うからです

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

そこで、SOについて少し調べたところ、古いバージョンのTomcatを使用している場合は、このjarをlibフォルダーに追加する必要があるという投稿が見つかりました。だから私は瓶を追加しました、そして今それは動作します、しかし私は最新のtomcatバージョンを使用しているので地球上で何が起こっているかについていくつかの情報が欲しいです。では、なぜファクトリを指定するとエラーが発生するのでしょうか。そして、私が追加しているこの瓶は何ですか、そしてなぜそれについてのドキュメントがほとんどないのですか?ここで何が起こっているかについての情報をいただければ幸いです。

4

2 に答える 2

63

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

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

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

この問題を特に対象としたドキュメントは正確にはありません。ただし、TomcatクラスローダーHOW-TOは、Tomcatのクラスローディング階層を理解するのに役立ちます。

ネストされたTomcatフォルダを示すスクリーンショット

参照:

于 2012-11-01T10:58:17.203 に答える
0

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

于 2014-05-08T18:56:24.233 に答える