Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Não consigo enviar comandos para o HSQLDB através da web

É aquele velho caso do "Na minha máquina funciona"...

Assim q terminei os cursos de Servlets + JDBC + JSF, fui colocar em prática a teoria e criar um CRUD utilizando os conceitos que vi.

Resumindo: Consegui upar o index p server, e funciona, agora criei uma servlet para testes:

package br.com.wolfgang.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.wolfgang.dao.VisitanteDAO;
import br.com.wolfgang.jdbc.ConnectionPool;
import br.com.wolfgang.modelo.Visitante;

@WebServlet(urlPatterns = "/novoVisitante")
public class novoVisitante extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String nome = "nome";
        String documento = "documento";
        String placa = "placa";
        String destino = "destino";
        try (Connection con = new ConnectionPool().getConnection()) {
            Visitante visitante = new Visitante(nome, documento, placa, destino);
            new VisitanteDAO(con);
            VisitanteDAO.inserir(visitante);
        } catch (Exception e) {
            e.printStackTrace();
        }
        PrintWriter writer = resp.getWriter();
        writer.println("Sucesso");
    }
}

Que utiliza a classe:

package br.com.wolfgang.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.hsqldb.jdbc.JDBCPool;

public class ConnectionPool {

    private DataSource dataSource;

    public ConnectionPool() {
        JDBCPool pool = new JDBCPool();
        pool.setUrl("jdbc:hsqldb:hsql://localhost/portariaMvn");
        pool.setUser("SA");
        pool.setPassword("");
        this.dataSource = pool;
    }

    public Connection getConnection() throws SQLException {
        Connection connection = dataSource.getConnection();
        return connection;
    }
}

E assim que acesso essa servlet, ela n executa. Recebo este erro:

HTTP Status 500 – Internal Server Error
Type Exception Report

Message Servlet execution threw an exception

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: Servlet execution threw an exception
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

java.lang.NoClassDefFoundError: org/hsqldb/jdbc/JDBCPool
    br.com.wolfgang.jdbc.ConnectionPool.<init>(ConnectionPool.java:15)
    br.com.wolfgang.web.novoVisitante.doGet(novoVisitante.java:36)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Root Cause

java.lang.ClassNotFoundException: org.hsqldb.jdbc.JDBCPool
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1275)
    org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
    br.com.wolfgang.jdbc.ConnectionPool.<init>(ConnectionPool.java:15)
    br.com.wolfgang.web.novoVisitante.doGet(novoVisitante.java:36)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Note The full stack trace of the root cause is available in the server logs.

Apache Tomcat/9.0.4

Porém se eu crio uma classe teste e tento rodar o main, acaba funcionando:

package br.com.wolfgang.jdbc;

import java.sql.Connection;
import java.sql.SQLException;

import br.com.wolfgang.dao.VisitanteDAO;
import br.com.wolfgang.modelo.Visitante;

public class TestaPool {
    public static void main(String[] args) throws SQLException {
        String nome = "nome";
        String documento = "documento";
        String placa = "placa";
        String destino = "destino";
        try (Connection con = new ConnectionPool().getConnection()) {
            Visitante visitante = new Visitante(nome, documento, placa, destino);
            new VisitanteDAO(con);
            VisitanteDAO.inserir(visitante);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Não sei como prosseguir a partir daqui. Acredito muito q tenha relação com o buildpath hsqldb. Segue o link para facilitar o entendimento. https://i.imgur.com/U4ZOK4p.png

2 respostas

Olá, tudo bem ?

Pelo erro, parece que ele não está encontrando as dependencias do hsqldb, será que você adicionou e configurou corretamente no seu projeto ?

solução!

Olá, Matheus. Acredito q sim. Porém, depois de alguns dias tentando métodos diferentes com o hsqldb, acabei resolvendo utilizar o postgresql e está funcionando muito bem. Apenas n consigo utilizar o poolconnection com ele. Ja peguei o exemplo de uma pool na própria documentação mas mesmo assim n fui capaz de utilizá-la.

Example 5-6. DataSource Code Example

Code to initialize a pooling DataSource might look like this:

Jdbc3PoolingDataSource source = new Jdbc3PoolingDataSource();
source.setDataSourceName("A Data Source");
source.setServerName("localhost");
source.setDatabaseName("test");
source.setUser("testuser");
source.setPassword("testpassword");
source.setMaxConnections(10);
Then code to use a connection from the pool might look like this. Note that it is critical that the connections are closed, or else the pool will "leak" connections, and eventually lock all the clients out.

Connection con = null;
try {
    con = source.getConnection();
    // use connection
} catch(SQLException e) {
    // log error
} finally {
    if(con != null) {
        try {con.close();}catch(SQLException e) {}
    }
}