2017-04-08 16 views
-1

私は誰かが私はこのエラーにサーブレットコードのエラー:HTTP 500内部サーバーエラー

のデバッグを助けてもらえ

を私は次のコードを実行しようとしているが、それは常に「HTTP 500内部サーバーエラー」になりサーブレットと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

ありがとうマット、私は接続プールに試してみましょう。 (しかし私はそれについてはあまり読んでいませんが) – avg998877

2

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

あなたが正しくあなたのDB接続を閉じずに、すべてのdoGet()リクエストに応じてMySQLデータベースに新しいDB接続を作成しようとしているので、このエラートレースはコンソールに表示されています。

これは、通信エラーが発生するたびに、クライアントが正常に接続を終了せずに終了したために中止された接続の数と接続に失敗した回数を示すAborted_clientsまたはAborted_connectsのステータスカウンタをインクリメントする理由です。 MySQLサーバ(それぞれ)。

この問題を引き起こすさまざまな理由から、ここで確認する必要がある重要なものはほとんどありません。

  • 正常に接続されたクライアントが、不適切に終端(及び が適切に接続を閉じないように関係してもよい)
  • クライアントは への接続を引き起こしてしまうた(秒は、interactive_timeout定義WAIT_TIMEOUT又は より長く寝WAIT_TIMEOUT秒間スリープし、その後、接続が
  • は、クライアントが異常終了したり、クエリのためのmax_allowed_pa​​cket を超えた)MySQLサーバによって閉じ 強制的に取得します

@Matt Clarkが述べたように、この問題を回避するために、またデータベースとのインタフェースに関する最良のプラチナに従うために、接続プールの仕組みに進むべきです。

+0

ありがとうございます@mhasan。私はこれをconnection-pool-mechanismに実装しようとします。 – avg998877

関連する問題