0

サーブレット内で JDO を動作させようとしています。シンプルで基本的なサーブレットです。非 JDO サーブレットが正常に動作し、データベースからデータを出力するため、サーブレットがデータベースに接続できることはわかっています (以下は単純なサーブレットの開始時です)。

 StringBuilder sb = new StringBuilder();
 Connection conn = null;
 try {
         String userName = "jdo";
         String password = "jdo";
         String url = "jdbc:mysql://192.168.2.203:3306/jdo";
         Class.forName( "com.mysql.jdbc.Driver" ).newInstance();
         conn = DriverManager.getConnection( url, userName, password );
         sb.append( "Database connection established" );

         Statement s = conn.createStatement();
         s.executeQuery( "select id, make, model from car limit 1" );
         ResultSet rs = s.getResultSet();
         while ( rs.next() ) {
                 int id = rs.getInt( "id" );
                 String make = rs.getString( "make" );
                 String model = rs.getString( "model" );
                 sb.append( "id = " + id + ", make = " + make + ", model = " + model + "\n" );
         }
         rs.close();
         s.close();

 }

これで問題ありません。StringBuilder は、追加されたデータベースから問題なくデータを取得します。ただし、機能しないのは次のとおりです。ここに貼り付けようとしている最後の行 (28 行目) でスタック トレースがスローされます (このコードは単純なサーブレットの先頭でもあり、前のコードが含まれていたものとは異なるサーブレットです)。

 Properties p = new Properties();
 p.setProperty( "javax.jdo.option.ConnectionDriverName", "com.mysql.jdbc.Driver" );
 p.setProperty( "javax.jdo.option.ConnectionURL", "jdbc:mysql://192.168.2.203:3306/jdo" );
 p.setProperty( "javax.jdo.option.ConnectionUserName", "jdo" );
 p.setProperty( "javax.jdo.option.ConnectionPassword", "jdo" );
 PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory( p );  // this is line 28

スタック トレースはかなり長いので、この投稿の一番下にあります。

これら 2 つのサーブレットは同じ war ファイルに存在し、その中に MySQL Connector/J jar ファイルがあります。

mkns@squeeze:~/workspace/JdoServlet$ jar tf dist/jdoservlet.war  | grep mysql
WEB-INF/lib/mysql-connector-java-5.1.6.jar

なぜ DataNucleus ライブラリが MySQL Connector/J ドライバーの jar ファイルを見つけられないのか、私は困惑していますか? ここで明らかなことを見逃しているかもしれませんが、問題がどこにあるかを確認するために(上記のように)サーブレットを可能な限り削除しましたが、どこが間違っているのかわかりません。誰かが私が犯している間違いを指摘できますか?

DataNucleus の最新バージョン 3.0.9 を使用しています。

--- 8< ---

そして今、スタックトレース; これは、Tomcat6 catalina ログ ファイルから取得した完全なスタック トレースです。私のアプリからの行は、com.xxxxxxxxxx.jdoservlet.* のマスクされたパッケージ名にあることに注意してください。そのため、それを探すと、私のアプリによって例外がスローされた場所を特定できます。

12-Apr-2012 18:48:47 org.datanucleus.store.rdbms.RDBMSStoreManager <init>
SEVERE: Failed initialising database.
No suitable driver found for jdbc:mysql://192.168.2.203:3306/jdo
org.datanucleus.exceptions.NucleusDataStoreException: No suitable driver found for jdbc:mysql://192.168.2.203:3306/jdo
        at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:459)
        at org.datanucleus.store.rdbms.RDBMSStoreManager.<init>(RDBMSStoreManager.java:264)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at org.datanucleus.plugin.NonManagedPluginRegistry.createExecutableExtension(NonManagedPluginRegistry.java:681)
        at org.datanucleus.plugin.PluginManager.createExecutableExtension(PluginManager.java:290)
        at org.datanucleus.NucleusContext.createStoreManagerForProperties(NucleusContext.java:468)
        at org.datanucleus.NucleusContext.initialise(NucleusContext.java:280)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:591)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:326)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:195)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951)
        at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
        at com.xxxxxxxxxx.jdoservlet.Test.process(Test.java:28)
        at com.xxxxxxxxxx.jdoservlet.AbstractServlet.doPost(AbstractServlet.java:35)
        at com.xxxxxxxxxx.jdoservlet.AbstractServlet.doGet(AbstractServlet.java:27)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://192.168.2.203:3306/jdo
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:154)
        at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:78)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1148)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
        at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:444)
        ... 39 more
Nested Throwables StackTrace:
java.sql.SQLException: No suitable driver found for jdbc:mysql://192.168.2.203:3306/jdo
        at java.sql.DriverManager.getConnection(DriverManager.java:602)
        at java.sql.DriverManager.getConnection(DriverManager.java:154)
        at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:78)
        at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582)
        at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1148)
        at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
        at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:444)
        at org.datanucleus.store.rdbms.RDBMSStoreManager.<init>(RDBMSStoreManager.java:264)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at org.datanucleus.plugin.NonManagedPluginRegistry.createExecutableExtension(NonManagedPluginRegistry.java:681)
        at org.datanucleus.plugin.PluginManager.createExecutableExtension(PluginManager.java:290)
        at org.datanucleus.NucleusContext.createStoreManagerForProperties(NucleusContext.java:468)
        at org.datanucleus.NucleusContext.initialise(NucleusContext.java:280)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:591)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:326)
        at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:195)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at javax.jdo.JDOHelper$16.run(JDOHelper.java:1956)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.jdo.JDOHelper.invoke(JDOHelper.java:1951)
        at javax.jdo.JDOHelper.invokeGetPersistenceManagerFactoryOnImplementation(JDOHelper.java:1159)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:839)
        at javax.jdo.JDOHelper.getPersistenceManagerFactory(JDOHelper.java:698)
        at com.xxxxxxxxxx.jdoservlet.Test.process(Test.java:28)
        at com.xxxxxxxxxx.jdoservlet.AbstractServlet.doPost(AbstractServlet.java:35)
        at com.xxxxxxxxxx.jdoservlet.AbstractServlet.doGet(AbstractServlet.java:27)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Thread.java:662)
4

2 に答える 2

2

ubuntu 12.04を実行しているマシンのtomcat7のpostgres jdbcドライバーを除いて、まったく同じエラーが発生しました。最終的に、jdbc ドライバーを war ファイルから取り出して、/usr/share/tomcat7/lib/ に配置しました。これは、Tomcat が jar ファイルを探すフォルダーです。

jdbc ドライバーはすべての tomcat コンテナー内のすべてのサーブレットにアクセスできるようになるため、このソリューションは万人向けではない可能性があります。

于 2013-07-23T05:42:59.000 に答える
1

最初のこと: 通常、データベース ドライバーをロードするためnewInstanceの呼び出しの後にへの呼び出しを省略します。Class.forName

2 つ目: DataNucleus は、独自の構成を好む場合があります。DataNucleus Web サイトに従って、次のプロパティを設定しようとしましたか?

datanucleus.ConnectionDriverName=com.mysql.jdbc.Driver datanucleus.ConnectionURL=jdbc:mysql://'host':'port'/'db-name' datanucleus.ConnectionUserName='user-name'
datanucleus.ConnectionPassword='password'

http://www.datanucleus.org/products/datanucleus/rdbms/support.html

さらに、ドライバーが正常にデプロイされたことを確認します。

この質問で指定されたディレクトリに jar を置くことは役に立ちますか?

于 2012-04-12T18:47:34.130 に答える