2017-04-08 228 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

相關問題