Erro estranho do Easy Tomcat 7 conectando-se ao banco de dados MySQL

0

Sou relativamente novo no servlet Java e no desenvolvimento de aplicativos da Web, mas isso é intrigante. Eu construí um projeto no Eclipse (Mars) que consiste principalmente de páginas HTML estáticas com um JSP que contém um formulário que faz um POST para um servlet. Este servlet simplesmente pegará os parâmetros da requisição e inserirá uma linha em uma tabela em um banco de dados MySQL. Abaixo está o código do servlet:

package boyd.apps.k9;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.RequestDispatcher;
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 java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

/**
 * Servlet implementation class ContactUs
 */
@WebServlet("/ContactUs")
public class ContactUs extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public ContactUs() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        String requestType = request.getParameter("requestType");
        String name = request.getParameter("name").toUpperCase();
        String company = request.getParameter("company").toUpperCase();
        String address = request.getParameter("address").toUpperCase();
        String city = request.getParameter("city").toUpperCase();
        String state = request.getParameter("state").toUpperCase();
        String zip = request.getParameter("zip");
        String phone = request.getParameter("phone");
        String email = request.getParameter("email").toUpperCase();
        String comments = request.getParameter("comments");
        String hrMin = request.getParameter("hr-min");
        String amPm = request.getParameter("am-pm");
        String timeToCall = hrMin + amPm;
        String sqlstr = null;
        Connection conn = null;
        Statement stmt = null;
        String dbuser = this.getServletContext().getInitParameter("dbuser");
        String dbpwd = this.getServletContext().getInitParameter("dbpwd");
        String url = this.getServletContext().getInitParameter("dburl");

        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch (ClassNotFoundException e) {
            System.out.println("MySQL JDBC Driver not found");
            return;
        }

        try {
            //conn = ds.getConnection(dbuser, dbpwd, url);
            conn = DriverManager.getConnection(url, dbuser, dbpwd);
        } catch (SQLException se) {
            System.out.println("Error connecting to database in ContactUs");
            se.printStackTrace();
            System.exit(1);
        }

        try {
            stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            sqlstr = "INSERT INTO LEADS (REQUEST_TYPE, NAME, COMPANY, ADDRESS, CITY, STATE, ZIP, PHONE, TIME_TO_CALL, EMAIL, COMMENTS) VALUES " +
                     "('" + requestType + "','" + name + "','" + company + "','" + address + "','" + city + "','" + state + "','" + zip + 
                     "','" + phone + "','" + timeToCall + "','" + email + "','" + comments + "')";
            stmt.executeUpdate(sqlstr);
        } catch (SQLException se) {
            System.out.println("Error inserting into LEADS");
            se.printStackTrace();
            System.exit(1);
        }

        RequestDispatcher view = null;
        view = request.getRequestDispatcher("index.html");
        view.forward(request, response);

    }

}

As informações de conexão do banco de dados, como você pode ver, são provenientes do arquivo web.xml como parâmetros de Contexto do Servlet (dbuser: k9_user ; senha: xxxx ; url: jdbc:mysql://localhost:3306/k9 ). Portanto, o nome do banco de dados MySQL é k9 e há apenas uma tabela configurada (LEADS). Como a raiz do MySQL, fazendo como use k9; para mudar para o banco de dados k9, eu dei todos os privilégios em LEADS para o k9_user . Toda essa configuração funciona bem na minha máquina local, apontando para um MySQL local e executando através do Apache Tomcat 8 no Eclipse.

Depois implantei esse aplicativo na VM no site host, configurei o banco de dados MySQL exatamente da mesma maneira e abri um navegador para executar o aplicativo. Eu naveguei para a página de entrada e enviei o formulário, e o aplicativo não apenas apresenta o erro abaixo, mas também trava todo o servidor de aplicativos Easy Tomcat 7 (o que é estranho o suficiente por si só, para o que parece ser uma tabela) erro não encontrado). O problema é que, nesse servidor host a partir da linha de comando, posso me conectar ao banco de dados k9 MySQL como esse usuário e fazer um "descrever leads"; e insira uma linha bem. Então, mais ainda, isso é um arranhão. De qualquer forma, a pilha de erros do log do Tomcat é a seguinte:

Nov 05, 2015 9:04:30 AM org.apache.catalina.core.ApplicationContext log
INFO: HTMLManager: list: Listing contexts for virtual host 'localhost'
com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Table 'k9.LEADS' doesn't exist
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:936)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2985)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723)
        at com.mysql.jdbc.Connection.execSQL(Connection.java:3277)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1402)
        at com.mysql.jdbc.Statement.executeUpdate(Statement.java:1317)
        at boyd.apps.k9.ContactUs.doPost(ContactUs.java:103)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
Service exit with a return value of 1

Se alguém se deparar com esse tipo de comportamento inconsistente, ou tiver visto mensagens de erro semelhantes como esta, em geral, quando estiver trabalhando com o MySQL via código Java, você pode ajudar em uma brutha?

    
por HoosierCB 05.11.2015 / 23:02

2 respostas

0

Habilite o log completo no MySQL ou no nível JDBC para capturar todas as consultas que estão ocorrendo entre o seu aplicativo e o MySQL. Verifique se o k9.LEADS possivelmente é descartado e não é recriado. Verifique também se todas as conexões vão para o servidor correto que realmente possui k9.LEADS.

    
por 05.11.2015 / 23:09
0

Eu explodi um pouco mais e descobri que o motivo da falha é que o nome da tabela no MySQL faz distinção entre maiúsculas e minúsculas; Portanto, não foi encontrado. Minha experiência está trabalhando com bancos de dados Oracle, onde referenciar nomes de tabelas com distinção entre maiúsculas e minúsculas não é por padrão. Obrigado pela sua contribuição, no entanto.

    
por 09.11.2015 / 22:46