2017-04-08 192 views
-1

我试图运行下面的代码,但它总是导致“HTTP 500内部服务器错误”servlet代码错误:HTTP 500内部服务器错误

有人能帮助我调试这个错误

我刚开始学习Servlets和JSP ..所以请原谅,如果我错过任何问题的细节。展望在MySQL数据库中的错误日志,我发现下面的条目:

Aborted connection 44 to db: 'sakila' user: 'root' host: 'localhost' (Got an error reading communication packets)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    response.setContentType("text/html"); 
    PrintWriter out=response.getWriter(); 
    final String DB_URL="jdbc:mysql://localhost:3306/sakila"; 
    final String user="root"; 
    final String password="pass1234"; 
    Statement stmt=null; 
    try { 
     Class.forName("com.mysql.jdbc.Driver"); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     out.println("Cannot load driver"); 
    } 
    Connection conn=null; 

    try { 
     conn=DriverManager.getConnection(DB_URL,user,password); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     out.println("Cannot Connect to Database"); 
    } 

    //out.print("Connected to Database"); 
    out.println("<html>"); 
    out.println("<body>"); 
    String str= "SELECT actor_id, first_name last_name FROM temp where actor_id='1';"; 

    try { 
     ResultSet rs=stmt.executeQuery(str); 
     while(rs.next()){ 
      out.println(rs.getString("actor_id")); 

     } 

    } catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    }  
    /* 
    try { 
     ResultSet rs; 
     rs = stmt.executeQuery(str); 
     while(rs.next()){ 
      int i=rs.getInt("actor_id"); 
      String fn= rs.getString("first_name"); 
      String ln=rs.getString("last_name"); 

      out.print(i+"::"); 
      out.print(fn+"::"); 
      out.print(ln+"::"); 
     } 
    } catch (SQLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    */ 
    out.print("hkshfdkhfakfshdkha"); 




    try { 
     conn.close(); 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    out.println("</body>"); 
    out.println("</html>"); 


} 
+2

不要忽略和忽略异常。在不终止流程流程的情况下打印异常仍然*忽略异常。另外,如果没有**查看服务器日志**,那里写入了实际错误,则无法确切地说明导致错误的原因。我们可以猜测(其他人在下面的答案中),但实际上有太多的可能性使其有用。 – Andreas

+0

我想到了这个问题。我忘了实例化Statement对象:stmt = conn.createStatement(); – avg998877

+0

感谢所有的帮助 – avg998877

回答

2

如果你检查你的应用程序日志,这是我的假设,你将看到生成的堆栈跟踪由

e1.printStackTrace(); 

这是因为你的SQL语法有错误。

SELECT actor_id, first_name last_name FROM temp where actor_id='1'; 
          /\ add missing comma 

请注意 - 您不应该在每个请求中建立到数据库的连接。这减慢了一切。

相反,您应该使用连接池,我建议C3P0

数据库日志突然终止的原因是因为您的应用程序抛出异常并放弃连接而未正确关闭它。

+0

谢谢Matt,我会试试Connection-pool。 (尽管我还没有多读书。) – avg998877

2

Aborted connection 44 to db: 'sakila' user: 'root' host: 'localhost' (Got an error reading communication packets)

此错误踪迹出现在您的控制台,因为你试图让没有正确关闭您的数据库连接新DB连接到每一个的doGet()请求的MySQL数据库。

这就是为什么每当发生通信错误时,它会增加Aborted_clients或Aborted_connects的状态计数器,它描述了由于客户端死亡而未正确关闭连接而中止的连接数以及连接失败的尝试次数MySQL服务器(分别)。

出于导致此问题的各种原因,以下是您可能需要检查的一些重要问题。

  • 客户端成功地连接,但不正确终止(和可能 涉及没有正确关闭连接)
  • 客户端睡大于定义WAIT_TIMEOUT较长或 interactive_timeout秒(这最终造成 连接睡WAIT_TIMEOUT秒钟,然后连接得到强行 MySQL服务器关闭)
  • 客户端异常终止或超过了max_allowed_pa​​cket的 进行查询

所以正如@Matt Clark提到的那样,您应该使用连接池机制来避免此问题,并遵循与数据库接口的最佳实践。

+0

谢谢@mhasan。我将尝试在连接池机制中实现这一点。 – avg998877

相关问题