我为我的困惑道歉,并询问是否有人能帮助我理解为什么我会有下面的行为。我使用的是mysql连接器v8.0.22 jar。我不认为这很重要,但我正在使用netbeansv12。
servlet和cmd版本都运行在同一台pc上。访问同一个db。
代码已从以下位置剪切和粘贴:
https://www.javatpoint.com/example-to-connect-to-the-mysql-database
我的问题是,为什么我在servlet中得到一个错误而不是cmd行?为什么会有区别?
我已尝试添加/删除(在链接中重新举例):
class.forname(“com.mysql.jdbc.driver”);
注意:我的db是血压而不是sonoo(链接中的示例)
我使用的用户是一个完整的管理员(不是root)用户。
问题是:
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bloodpressure","xxxx","xxxxx");
在命令行版本中,它返回一个有效的con并运行select。在servlet中,getconnection抛出一个异常,该异常不是关键。事实上确实如此。
这应该没什么区别,但我试过了。linux、ms-mysql v5和mac-version:8.0.22(mysql community server-gpl)为mac编译。
我也尝试过mysql连接器v5和v。8.0.22
有人能解释一下为什么会有不同吗?
我尝试过很多变化,做过很多谷歌搜索,但一直遇到同样的问题。谢谢
===========根据luke的请求更新我创建了两个相同的项目,一个java应用程序,一个web应用程序,就像我以前解决这个问题的尝试一样。
两者都使用mysql连接器v8.0.22和jdk15
命令行应用程序的代码是:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package cmdlinedbtest;
import java.sql.*;
/**
*
* @author jeff
*/
public class CmdLineDbTest {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try{
Class.forName("com.mysql.jdbc.Driver");
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bloodpressure","xxx","xxxxx");
//here sonoo is the database name, root is the username and root is the password
Statement stmt=(Statement) con.createStatement();
ResultSet rs=stmt.executeQuery("select * from users");
while(rs.next())
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
===========网站是:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* @author jeff
*/
public class DbConnect extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try ( PrintWriter out = response.getWriter()) {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet DbConnect</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet DbConnect at " + request.getContextPath() + "</h1>");
try {
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bloodpressure", "xxxx", "xxxx");
//here sonoo is the database name, root is the username and root is the password
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from users");
while (rs.next()) {
out.println("<br/>" + rs.getInt(1) + "<br/> " + rs.getString(2) + "<br/> " + rs.getString(3));
}
con.close();
} catch (Exception e) {
out.println(e);
}
out.println("</body>");
out.println("</html>");
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
同样,cmd行工作并返回数据行。servlet在连接时引发异常。
请解释为什么结果不同。
谢谢
1条答案
按热度按时间7cwmlq891#
由于这件事困扰了我一段时间,我当然一直在思考,并想出了一些办法。我的问题是,为什么当代码/构建尽可能相同时,它在cmd行工作,在servlet中出错?
有什么区别?我能想到的唯一区别是cmdline直接运行(就像java一样),它在jvm中运行。我想你可以把它当作一个常量而忽略不计,我想app server运行的是同一个jvm,但在这个阶段我不能确定这一点)。servlet通过appserver运行。在我的例子中,我在tomcat7年前就遇到了问题,所以改用payara,它在很多项目上都很好地工作。
所以我想,为什么不试试别的应用服务器呢。
一个干净的tomcat9安装-没有额外的配置,就像它来了。
它工作。。。。。。。。哎呀。
我不知道为什么它在Tomcat9上有效,而不是payara 5,但它确实有效。我希望这能对其他人有所帮助,因为我尝试了大量所谓的修复,不同的编码方式,就像很多人一样迷失在错误的细节中,而不是简单的事实,cmd line没有错误,servlet没有。因此,错误的细节具有误导性。这只是一个事实,一个工作,一个不。
感谢你的帮助,人们一直在寻找帮助。