2012-04-12 3 views
0

Я пытаюсь заставить JDO работать в Servlet; просто простой базовый сервлет. Я знаю, что Servlet может подключиться к БД, потому что сервлет не-СДО делает это хорошо, и выводит данные из БД (следующее в начале простого Servlet):Сервлет с использованием Datanucleus JDO не может найти драйвер MySQL

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 получает данные из db без проблем. Что не Работа, однако, является следующим. Он выдает трассировку стека на последней строке (строка 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 

След стека находится внизу этого сообщения, так как он довольно длинный.

Эти два сервлетов существуют в одной и той же войны файл, внутри которого баночка файл MySQL Connector/J:

[email protected]:~/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) 
+0

Очевидно, что SQLException * не * выбрано из JDOHelper, оно выбрано из классов JDBC. Распечатайте трассировку стека – DataNucleus

+0

Конечно, это сделано для вас. Это трассировка стека, брошенная в файл журнала tomcat6 catalina, сообщите мне, если это не то, что вы хотели видеть. – Kenny

ответ

1

Первое: Вы обычно опускаем вызов newInstance после Class.forName вызова, чтобы загрузить драйвер базы данных.

Во-вторых: DataNucleus предпочитает иногда свою собственную конфигурацию. Вы пытались установить следующие свойства в соответствии с веб-сайтом DataNucleus?

datanucleus.ConnectionDriverName = com.mysql.jdbc.Driver datanucleus.ConnectionURL = JDBC: MySQL: // хост ': 'Порт'/ 'дб имя' имя пользователя datanucleus.ConnectionUserName =' '
datanucleus.ConnectionPassword =' ​​пароль»

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

Кроме того, проверьте, что драйвер был успешно развернут.

Помогает ли положить банку в каталог, указанный в this question?

+0

Первое: это была одна из моих попыток заставить ее работать, я просто забыл ее удалить; его избыточность. Во-вторых, настройки конфигурации отлично работают в приложении CLI, и они, кажется, читаются, поскольку он знает, чтобы попытаться забрать драйвер MySQL. Что касается развертывания драйвера, я считаю, что продемонстрировал это в моем OP? Вы не согласны и думаете, что мне нужно сделать больше, чтобы доказать, что оно было развернуто в военном файле? – Kenny

+0

WAR - это просто архив. Может быть, Tomcat не распакует его правильно? Попробуйте перераспределить. Кроме того, какова ваша среда разработки? Затмение? – phineas

+0

Tomcat распаковывает его без проблем, так как я вижу содержимое распакованной войны в webapps/dir. Я использую Eclipse, да, но код скомпилирован, расширен и встроен в военный файл, используя Ant, а не Eclipse. Я вижу, что вы отредактировали свой ответ, чтобы спросить, помогает ли использование MySQL Connector/J в каталоге lib/Tomcat ... ну, он «помогает» в том, что он заставляет его работать, но я бы предпочел иметь MySQL Connector/J jar внутри файла войны webapp, если это возможно. Может быть, это не возможно для этого? – Kenny

2

У меня была такая же ошибка, кроме как для драйвера postgres jdbc на tomcat7 на машине, работающей на ubuntu 12.04. Я закончил тем, что вытащил драйвер jdbc из файла войны и поместил его в/usr/share/tomcat7/lib /. Это папка, в которой tomcat ищет файлы jar.

Это решение может быть не для всех, так как драйвер jdbc теперь будет доступен для всех сервлетов во всех контейнерах tomcat.

Смежные вопросы