Как использовать базу данных JavaDB из сервлета Java в Jetty?

Я создал проект Динамическая веб-страница в Eclipse и закодировал сервлет. Я добавил derby.jar в качестве библиотеки. Когда я собираюсь развернуть проект, я экспортирую его как файл .war, а затем запускаю Jetty с java -jar start.jar. Сервлет отлично работает без кода базы данных. Но когда я пытаюсь использовать базу данных JavaDB, драйвер JDBC не может быть найден. Как использовать базу данных JavaDB из моего сервлета в Jetty?

Я пытаюсь использовать базу данных в памяти для тестирования, и мой код выглядит так:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                         throws ServletException, IOException {

    String sql =    "DECLARE GLOBAL TEMPORARY TABLE SESSION.mytable "+
                    "(id int, message varchar(10)) NOT LOGGED";

    String connURL = "jdbc:derby:memory:memdatabase;create=true";


    try {
        Connection conn = DriverManager.getConnection(connURL);
        PreparedStatement ps = conn.prepareStatement(sql);
        boolean success = ps.execute();
        System.out.println("created: " + success);
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

Вот исключение, которое выбрасывается:

java.sql.SQLException: No suitable driver found for jdbc:derby:memory:memdatabas
e;create=true
        at java.sql.DriverManager.getConnection(Unknown Source)
        at java.sql.DriverManager.getConnection(Unknown Source)
        at com.example.MyJavaServlet.doPost(MyJavaServlet.java:59)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
        at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:598
)
        at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java
:486)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:119)
        at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.jav
a:499)
        at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandl
er.java:233)
        at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandl
er.java:1065)
        at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:
413)
        at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandle
r.java:192)
        at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandle
r.java:999)
        at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.j
ava:117)
        at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(Cont
extHandlerCollection.java:250)
        at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerColl
ection.java:149)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper
.java:111)
        at org.eclipse.jetty.server.Server.handle(Server.java:350)
        at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(Abstrac
tHttpConnection.java:454)
        at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpC
onnection.java:900)
        at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.conten
t(AbstractHttpConnection.java:954)
        at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851)
        at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)

        at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnecti
on.java:77)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEn
dPoint.java:606)
        at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEnd
Point.java:46)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPoo
l.java:603)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool
.java:538)
        at java.lang.Thread.run(Unknown Source)

person Jonas    schedule 27.04.2012    source источник


Ответы (1)


Вы не загрузили класс драйвера перед получением соединения:

Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection conn = ...

В качестве примечания вы также можете реорганизовать процесс загрузки класса драйвера и использования подключений к одной точке в вашем приложении.

person nobeh    schedule 27.04.2012
comment
Это дает мне java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver вместо этого. - person Jonas; 27.04.2012
comment
Тогда это означает, что вы НЕ включили JAR-файл Apache Derby (JavaDB) в папку lib вашего веб-приложения. Если вы используете Maven, просто включите зависимость в вашем файле POM; или загрузите его и включите в структуру вашей библиотеки. - person nobeh; 27.04.2012
comment
Хорошо, я добавил копию derby.jar в WEB-INF\lib, и теперь это работает. Class.forName-код не нужен. Спасибо. - person Jonas; 27.04.2012
comment
Очень интересно, не знал! - person nobeh; 27.04.2012
comment
Это действительно не нужно, так как новый Java 1.6 ServiceLoader API. Все драйверы, совместимые с JDBC 4.0, поддерживают это. - person BalusC; 27.04.2012