Java MySQL JDBC连接在部署到web服务器时失败

Java MySQL JDBC连接在部署到web服务器时失败,java,mysql,tomcat,jenkins,jdbc,Java,Mysql,Tomcat,Jenkins,Jdbc,我目前在CentOS机器上部署了一个MySQL数据库。我可以通过MySQL Workbench查询数据库,也可以在本地开发环境中使用MySQL JDBC连接到数据库。这两种连接都可以正常工作。然而,我正在构建一个web应用程序,它使用Jenkins构建并部署到Tomcat web服务器上。但是,一旦部署,连接就会失败。我不知道我哪里出错了。我把代码放在下面,但出于安全原因省略了密码。它是正确的,我已经验证了多次。在服务器日志中,引发和捕获的错误是conn为null的结果。这意味着它永远不会被设置

我目前在CentOS机器上部署了一个MySQL数据库。我可以通过MySQL Workbench查询数据库,也可以在本地开发环境中使用MySQL JDBC连接到数据库。这两种连接都可以正常工作。然而,我正在构建一个web应用程序,它使用Jenkins构建并部署到Tomcat web服务器上。但是,一旦部署,连接就会失败。我不知道我哪里出错了。我把代码放在下面,但出于安全原因省略了密码。它是正确的,我已经验证了多次。在服务器日志中,引发和捕获的错误是conn为null的结果。这意味着它永远不会被设置,因为参数不正确。我唯一的猜测是,当应用程序移动到web服务器上时,JDBCURL的地址会发生变化

enter code here//Connection for database
private static Connection conn;

//Database parameters
private String url = "jdbc:mysql://autograder.clarkson.edu:3306/autograder_db";
private String localdevuser = "autograder_dev";
private String user = "autograder_local";
private String password = "-------";

private String getUsername(){
    //LOG.publish(new LogRecord(Level.INFO, "user is: " + (AssertionHolder.getAssertion().getPrincipal().getName())));
    //return AssertionHolder.getAssertion().getPrincipal().getName();
    return "testuser";
}

public List<Course> queryCourses(){

    //Debug statement
    LOG.publish(new LogRecord(Level.INFO, "#establishConn"));

    Connection conn = null;
    List<Course> courseList = new ArrayList<Course>();

    try{            
        //create connection to database
        conn = DriverManager.getConnection(url, user, password);
        LOG.publish(new LogRecord(Level.INFO, "Conn = " + conn));
    } 
    catch (SQLException e){
        //Handle exception here
        LOG.publish(new LogRecord(Level.INFO, "#DatabaseQuery Failed: " + e.toString()));
    }
    finally {
        try{
            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: DB Connection Successful"));

            //Temp course selection
            String sql = "SELECT c.course_id, c.course_title, c.course_num, c.course_descr "
                    + "FROM enrollment e LEFT JOIN courses c "
                    + "ON e.enr_cid = c.course_id WHERE e.enr_username = \"" + getUsername() + "\";";

            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: String entered"));

            Statement stmt;
            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: stmt"));
            stmt = conn.createStatement();
            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: conn.createStatement()"));
            ResultSet rs = stmt.executeQuery(sql);
            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: RS"));

            while(rs.next()){
                courseList.add(new Course(Integer.parseInt(rs.getString("course_id")), rs.getString("course_num"), rs.getString("course_title"), true));
                LOG.publish(new LogRecord(Level.INFO, "Course: " + rs.getString("course_title")));
            }

            LOG.publish(new LogRecord(Level.INFO, "#establishConnection: Statement run"));

            return courseList;
        } 
        catch (SQLException ex){    
        }
    }
    return courseList;

错误的可能原因是您设计逻辑的方式。您拥有finally块中的大部分逻辑。这是个坏主意。例如,如果DriverManager.getConnection失败并引发异常,则finally块中的代码仍将在conn仍为null的情况下执行,从而导致NullPointerException

我会将您的代码重新组织为:

List<Course> courseList = new ArrayList<Course>();

try (Connection conn = DriverManager.getConnection(url, user, password)) {
     String sql = ...
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql);
     while(rs.next()) {
         courseList.add(new Course(...));
     }
} catch (SQLException e) {
    //Handle exception here
    LOG.publish(new LogRecord(Level.INFO, "#DatabaseQuery Failed: " + e.toString()));
}
return courseList;

我知道我的错误是由conn=null连接引起的。然而,我的问题是,我想还不是很清楚,为什么当我在本地编译代码时,这些代码可以工作,但当它部署到web服务器上时却失败了?不知道——可能有几个原因。可能会引发异常?如果是这样的话,看起来像是您记录了它。异常及其错误消息是什么?您可能还希望转储堆栈跟踪。这应该给你一个想法。数据库的日志可能也有有用的信息-如果连接到了那么远。谢谢你的帮助。如果我知道出了什么问题,我会回答这个问题。