だから、私は自分のエラーを理解しました、今は正確に何が起こっているかについての洞察を探しています。 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とは何ですか、またそれについてのドキュメントがほとんどないのはなぜですか?ここで何が起こっているかについての情報は大歓迎です。
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のクラス読み込み階層を理解するのに役立ちます。
私は同じ問題を抱えていた、あなたの解決策は私のために機能しませんでした。 「mysql-connector-Java-5.1.30-bin.jar」ファイルをlibフォルダーに追加する必要がありました。そのドライバーを使用していたためです:)乾杯。