Seltsamer Fehler von Easy Tomcat 7 beim Herstellen einer Verbindung zur MySQL-Datenbank

671
HoosierCB

Ich bin relativ neu in der Entwicklung von Java-Servlets und Web-Apps, aber das ist rätselhaft. Ich habe ein Projekt in Eclipse (Mars) erstellt, das hauptsächlich aus statischen HTML-Seiten mit einer JSP besteht, die ein Formular enthält, das einen POST für ein Servlet ausführt. Dieses Servlet übernimmt einfach die Parameter aus der Anfrage und fügt eine Zeile in eine Tabelle in einer MySQL-Datenbank ein. Unten ist der Servlet-Code:

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);  }  } 

Wie Sie sehen, stammen die Datenbankverbindungsinformationen aus der Datei web.xml als Servlet-Kontextparameter (dbuser:; k9_userpassword :; xxxxurl :) jdbc:mysql://localhost:3306/k9. Der MySQL-Datenbankname lautet also k9, und es gibt nur die eine Tabelle (LEADS). Als MySQL-Root use k9;habe ich beim Wechseln in die k9-Datenbank alle Privilegien für LEADS an die gegebenk9_user . Diese gesamte Konfiguration funktioniert auf meinem lokalen Computer einwandfrei, zeigt auf ein lokales MySQL und läuft über Apache Tomcat 8 auf Eclipse.

Anschließend implementiere ich diese App auf der VM am Host-Standort, richten die MySQL-Datenbank auf dieselbe Weise ein und öffne einen Browser, um die App auszuführen. Ich navigiere zu der Einstiegsseite und sende das Formular. Die App wirft nicht nur den folgenden Fehler ab, sondern der gesamte Easy Tomcat 7-App-Server stürzt ab (was seltsam genug ist, um eine "Tabelle" zu sein kein Fehler gefunden). Die Sache ist, dass ich auf diesem Host-Server von der Befehlszeile aus eine Verbindung zur MySQL-Datenbank von k9 als diesen Benutzer herstellen kann und eine "Leads beschreibe;" und füge eine reihe rein. Also, sogar mehr, das ist ein Kopf-Kratzer. Der Fehlerstapel aus dem Tomcat-Protokoll lautet jedoch wie folgt:

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 

Wenn jemand auf diese Art von inkonsistentem Verhalten gestoßen ist oder ähnliche Fehlermeldungen generell angezeigt hat, wenn Sie mit MySQL über Java-Code arbeiten, können Sie einem Brutha dabei helfen?

0

2 Antworten auf die Frage

0
Sasha Pachev

Aktivieren Sie die vollständige Protokollierung in MySQL oder auf JDBC-Ebene, um alle Abfragen zwischen Ihrer Anwendung und MySQL zu erfassen. Prüfen Sie, ob k9.LEADS möglicherweise gelöscht und nicht erneut erstellt wird. Vergewissern Sie sich auch, dass alle Verbindungen zu dem richtigen Server mit k9.LEADS gehen.

0
HoosierCB

Ich habe ein wenig mehr gegraben und festgestellt, dass der Grund für den Fehler darin liegt, dass der Tabellenname in MySQL zwischen Groß- und Kleinschreibung unterscheidet. daher wurde es nicht wirklich gefunden. Mein Hintergrund arbeitet mit Oracle-Datenbanken, bei denen das Referenzieren von Tabellennamen im Hinblick auf Groß- und Kleinschreibung nicht standardmäßig vorgesehen ist. Vielen Dank für Ihren Beitrag.