mysql jodbc db connect问题-cmd行应用程序运行良好在同一个数据库上运行相同代码的servlet,drivermanager.getconnection引发异常

raogr8fs  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(228)

我为我的困惑道歉,并询问是否有人能帮助我理解为什么我会有下面的行为。我使用的是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在连接时引发异常。
请解释为什么结果不同。
谢谢

7cwmlq89

7cwmlq891#

由于这件事困扰了我一段时间,我当然一直在思考,并想出了一些办法。我的问题是,为什么当代码/构建尽可能相同时,它在cmd行工作,在servlet中出错?
有什么区别?我能想到的唯一区别是cmdline直接运行(就像java一样),它在jvm中运行。我想你可以把它当作一个常量而忽略不计,我想app server运行的是同一个jvm,但在这个阶段我不能确定这一点)。servlet通过appserver运行。在我的例子中,我在tomcat7年前就遇到了问题,所以改用payara,它在很多项目上都很好地工作。
所以我想,为什么不试试别的应用服务器呢。
一个干净的tomcat9安装-没有额外的配置,就像它来了。
它工作。。。。。。。。哎呀。
我不知道为什么它在Tomcat9上有效,而不是payara 5,但它确实有效。我希望这能对其他人有所帮助,因为我尝试了大量所谓的修复,不同的编码方式,就像很多人一样迷失在错误的细节中,而不是简单的事实,cmd line没有错误,servlet没有。因此,错误的细节具有误导性。这只是一个事实,一个工作,一个不。
感谢你的帮助,人们一直在寻找帮助。

相关问题