Servlet 代码错误:http 500 内部服务器错误



我正在尝试运行以下代码,但它总是导致"http 500 内部服务器错误">

有人可以帮我调试此错误吗

我刚开始学习Servlets和JSP。因此,如果我错过了问题中的任何细节,请原谅我。查看MYSQL数据库错误日志,我发现了以下条目:

中止与数据库的连接 44:"sakila"用户:"根"主机:"本地主机"(读取通信数据包时出错)

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

}

中止与数据库的连接 44:"sakila" 用户:"根"主机:"本地主机" (读取通信数据包时出错)

此错误跟踪出现在控制台中,因为您尝试在每个 doGet() 请求上与 mysql 数据库建立新的数据库连接,而没有正确关闭数据库连接。

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

在导致此问题的各种原因中,您可能需要检查以下几个重要原因。

  • 客户端连接成功,但终止不正确(并且可能 与未正确关闭连接有关)
  • 客户端的睡眠时间超过定义的wait_timeout或 interactive_timeout 秒(最终导致连接 睡眠 wait_timeout 秒,然后连接被强制 被 MySQL 服务器关闭)
  • 客户端异常终止或超过max_allowed_packet 对于查询

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

如果您检查应用程序日志,我假设您将看到由

e1.printStackTrace();

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

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

附带说明一下 - 您不应该在每个请求中建立与 databse 的连接。这会减慢一切。

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

数据库日志中突然终止的原因是,应用程序引发异常并放弃连接而未正确关闭连接。

相关内容

最新更新