Java项目

时间:2018-06-10 12:49:29

标签: java oracle11g nullpointerexception glassfish-5

我是一名学生,其中一项任务是在本地GlassFish 5网络服务器上创建一个Java Web项目。用于此项目的数据库是在Docker容器中本地运行的OracleDB。

我几乎完成了我的项目,但有些页面一直在崩溃(NullPointerException)。我必须检索数据库记录并将它们保存在ArrayList中。但有时SQLConnection不返回任何内容(但记录存在),我的代码尝试在该空ArrayList上执行操作。

现在,正如我所说,连接似乎不稳定,因为在一些看似随机的时刻,数据库确实会回复相应的记录。

这真的令人沮丧,如果没有稳定的数据库连接,我无法继续处理这个项目。所以我很高兴听到有更多经验的人的回音: - )

感谢您的时间。

运行查询的代码:

protected ResultSet getRecords(String query) {
        try {
            Connection connection = DriverManager.getConnection(url, login, password);
            Statement statement = connection.createStatement();
            return (ResultSet) statement.executeQuery(query);
        } catch (SQLException e) {
            e.getStackTrace();
        } 
        return null;
    }

查询代码:

List<Uitlening> uitleningen = new ArrayList<Uitlening>();

        try {
            ResultSet resultSet = getRecords("SELECT * FROM uitlening");

            while(resultSet.next()) { //Here the code crashes because the ResultSet can sometimes be empty.

我认为这是实际的错误消息:Listener拒绝连接时出现以下错误:ORA-12519,TNS:找不到合适的服务处理程序

但我真的不明白我现在该做什么..

 try {
        ResultSet resultSet = getRecords("SELECT * FROM uitlening");

        while(resultSet.next()) { 
            Uitlening uitlening = new Uitlening();
            uitlening.setNr(resultSet.getInt("nr"));                
            uitleningen.add(uitlening);
        }
    } catch (SQLException e) {
        e.addSuppressed(e);
    } 
    return uitleningen;

它可能什么都没有,但它几乎看起来只有在我几乎立即运行2个查询后才会出现错误。是否有可能关闭连接需要一段时间?

1 个答案:

答案 0 :(得分:2)

您可能会遇到数据库连接问题,因为您的代码没有正确关闭数据库连接以及语句和结果集。

语句也将关闭其活动结果集。如果连接关闭,大多数JDBC也将关闭语句。

因此关闭连接是最重要的部分。使用当前的代码结构无法实现,因为您在内部方法中创建它并且不返回它。

还有人提到异常处理很差,因为你忽略异常并返回 null 而不是在以后导致看似无关的崩溃。在许多情况下,可能更容易声明该方法抛出SQLException

您可能希望更改代码:

List<Uitlening> retrieveData() {
    final String query = "SELECT * FROM uitlening";
    try (Connection connection = DriverManager.getConnection(url, login, password);
         Statement statement = connection.createStatement();
         ResultSet resultSet = statement.executeQuery(query)) {
        return processResultSet(resultSet);
    } catch (SQLException e) {
        throw new RuntimeException(e);
    }
}

List<Uitlening> processResultSet(ResultSet resultSet) throws SQLException {
    List<Uitlening> uitleningen = new ArrayList<>();
    while (resultSet.next()) {
        Uitlening uitlening = new Uitlening();
        uitlening.setNr(resultSet.getInt("nr"));
        uitleningen.add(uitlening);
    }
    return uitleningen;
}

它通过使用利用AutoClosable s的try / catch块来关闭连接,语句和结果集(在这种情况下:ConnectionStatement,{{1 }})。

方法ResultSet声明processResultSet,因此无需处理它。

代码重新排列,以便在代码离开关闭连接的try / catch块之前完全处理数据。