繁体   English   中英

Java项目的不稳定Oracle数据库连接

[英]Unstable Oracle Database connection for Java-project

我是一名学生,我们的一项任务是在本地GlassFish 5 Web服务器上创建一个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.

我认为这是实际的错误消息:侦听器拒绝了以下错误的连接: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个查询时才会发生错误。 关闭连接是否可能需要一段时间?

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

一条语句还将关闭其活动结果集。 如果连接关闭,大多数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的try / catch块(在本例中为ConnectionStatementResultSet ),它关闭连接,语句和结果集。

方法processResultSet声明了SQLException因此不需要处理它。

代码经过重新排列,因此在代码离开try / catch块关闭连接之前,已对数据进行了完全处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM