【问题标题】:MySQL JDBC Connection fails when deployed to web server部署到 Web 服务器时 MySQL JDBC 连接失败
【发布时间】:2018-04-13 05:14:43
【问题描述】:

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

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;

【问题讨论】:

    标签: java mysql tomcat jenkins jdbc


    【解决方案1】:

    错误的可能原因是您设计逻辑的方式。您在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;
    

    【讨论】:

    • 我了解我的错误是由 Connection conn = null 引起的。但是,我的问题是,我想还不是很清楚,为什么这段代码在我本地编译时可以工作,但在部署到 Web 服务器时却失败了?
    • 不知道 - 可能有几个原因。大概是抛出异常?如果是这样,它看起来像你记录它。什么是异常及其错误消息?您可能还想转储堆栈跟踪。这应该给你一个想法。数据库的日志也可能包含有用的信息 - 如果连接到了那么远。
    • 感谢戴夫的帮助。如果我弄清楚出了什么问题,我会回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 2016-04-28
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2018-05-17
    相关资源
    最近更新 更多