Странная ошибка подключения Easy Tomcat 7 к базе данных MySQL

600
HoosierCB

Я довольно новичок в разработке Java-сервлетов и веб-приложений, но это озадачивает. Я построил проект в Eclipse (Mars), который состоит в основном из статических HTML-страниц с одним JSP, который содержит форму, которая выполняет POST для сервлета. Этот сервлет просто берет параметры из запроса и вставляет строку в таблицу в базе данных MySQL. Ниже приведен код сервлета:

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

Как вы видите, информация о соединении с базой данных поступает из файла web.xml в качестве параметров контекста сервлета (dbuser:; k9_userpassword xxxx:; url:) jdbc:mysql://localhost:3306/k9. Итак, имя базы данных MySQL есть k9, и настроена только одна таблица (LEADS). Как корень MySQL, use k9;переключаясь на базу данных k9, я дал все привилегии на LEADS k9_user. Вся эта конфигурация прекрасно работает на моем локальном компьютере, указывая на локальный MySQL, и работает через Apache Tomcat 8 на Eclipse.

Затем я развертываю это приложение на виртуальной машине на хост-сайте, точно так же настраиваю базу данных MySQL и открываю браузер для запуска приложения. Я перехожу на страницу ввода и отправляю форму, и приложение не только выдает ошибку, указанную ниже, но и приводит к сбою всего сервера приложений Easy Tomcat 7 (что само по себе достаточно странно, для того, что кажется «таблицей»). не найдена ошибка). Дело в том, что на этом хост-сервере из командной строки я могу подключиться к базе данных MySQL k9 как этот пользователь и выполнить «описать потенциальных клиентов»; и вставьте строку в него просто отлично. Так что, более того, это головокружение. В любом случае, стек ошибок из журнала Tomcat выглядит следующим образом:

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 

Если кто-то сталкивался с этим типом непоследовательного поведения, или видел подобные сообщения об ошибках, как это вообще при работе с MySQL через код Java, вы можете помочь брутхе?

0

2 ответа на вопрос

0
Sasha Pachev

Включите полную регистрацию в MySQL или на уровне JDBC, чтобы захватить все запросы, которые идут между вашим приложением и MySQL. Проверьте, возможно ли, что k9.LEADS удален и не создан заново. Также дважды проверьте, что все соединения идут к правильному серверу, который фактически имеет k9.LEADS.

0
HoosierCB

I did a little more digging, and found that the reason for the failure is that the table name in MySQL is case-sensitive; hence, it wasn't actually found. My background is working with Oracle databases, where referencing table names with case-sensitivity in mind is not by default. Thanks for your input, though.

Похожие вопросы