ข้อผิดพลาดแปลก ๆ จาก Easy Tomcat 7 ที่เชื่อมต่อกับฐานข้อมูล MySQL


0

ฉันค่อนข้างใหม่สำหรับ Java servlet และการพัฒนาแอปพลิเคชันบนเว็บ แต่นี่เป็นเรื่องที่น่าสงสัย ฉันได้สร้างโครงการใน Eclipse (Mars) ที่ประกอบด้วยส่วนใหญ่ของหน้า HTML คงที่ด้วย JSP หนึ่งที่มีรูปแบบที่จะ POST ไปยัง servlet เซิร์ฟเล็ตนี้จะใช้พารามิเตอร์จากคำขอและแทรกแถวลงในตารางในฐานข้อมูล MySQL ด้านล่างเป็นรหัส 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);

    }

}

ข้อมูลการเชื่อมต่อฐานข้อมูลที่คุณสามารถดูจะมาจากไฟล์ web.xml เป็นพารามิเตอร์ Servlet บริบท (DbUser: k9_user; รหัสผ่าน: xxxx; url: jdbc:mysql://localhost:3306/k9) ดังนั้นชื่อฐานข้อมูล MySQL คือk9และมีเพียงหนึ่งตารางที่ตั้งค่า (LEADS) ในฐานะที่เป็นราก MySQL, ทำเป็นuse k9;เพื่อสลับไปยังฐานข้อมูล k9 k9_userที่ฉันได้รับสิทธิพิเศษทั้งหมดจะนำไปสู่ การกำหนดค่าทั้งหมดนี้ใช้งานได้ดีบนเครื่องของฉันชี้ไปที่ MySQL โลคัลและวิ่งผ่าน Apache Tomcat 8 บน Eclipse

จากนั้นฉันปรับใช้แอพนี้กับ VM ที่โฮสต์ไซต์ตั้งค่าฐานข้อมูล MySQL ในลักษณะเดียวกันและเปิดเบราว์เซอร์เพื่อเรียกใช้แอป ฉันนำทางไปยังหน้ารายการและส่งแบบฟอร์มและไม่เพียง แต่แอปจะแสดงข้อผิดพลาดด้านล่าง แต่เกิดปัญหาเซิร์ฟเวอร์แอป Easy Tomcat 7 ทั้งหมด (ซึ่งแปลกพอสำหรับตัวเองสำหรับสิ่งที่ดูเหมือนจะเป็น "ตาราง" ข้อผิดพลาดไม่พบ ") สิ่งนี้คือบนโฮสต์เซิร์ฟเวอร์นั้นจากบรรทัดคำสั่งฉันสามารถเชื่อมต่อกับฐานข้อมูล k9 MySQL ในฐานะผู้ใช้นั้นและทำ "อธิบายลีดเดอร์; และแทรกแถวลงไปได้เลย ดังนั้นแม้แต่ moreso นั่นคือหัวขูดขีด อย่างไรก็ตามข้อผิดพลาดสแต็กจากบันทึก 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 คุณสามารถช่วย brutha ได้หรือไม่?

คำตอบ:


0

เปิดใช้งานการบันทึกอย่างเต็มรูปแบบใน MySQL หรือในระดับ JDBC เพื่อรวบรวมคำค้นหาทั้งหมดที่เกิดขึ้นระหว่างแอปพลิเคชันของคุณและ MySQL ตรวจสอบว่า k9.LEADS อาจถูกทิ้งหรือไม่ถูกสร้างขึ้นใหม่ ตรวจสอบอีกครั้งว่าการเชื่อมต่อทั้งหมดไปที่เซิร์ฟเวอร์ด้านขวาที่มี k9.LEADS


0

ฉันขุดอีกเล็กน้อยและพบว่าสาเหตุของความล้มเหลวก็คือชื่อตารางใน MySQL นั้นเป็นแบบตรงตามตัวพิมพ์ใหญ่ - เล็ก ดังนั้นจึงไม่พบจริง พื้นหลังของฉันทำงานกับฐานข้อมูล Oracle โดยที่การอ้างอิงชื่อตารางที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่นั้นไม่ใช่ค่าเริ่มต้น ขอบคุณสำหรับการป้อนข้อมูลของคุณแม้ว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.