gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:08:25 24 4
gpt4 key购买 nike

我是一名学生,我们的任务之一是在本地 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 个查询时才会发生该错误。关闭连接是否可能需要一段时间?

最佳答案

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

语句还将关闭其 Activity 结果集。如果连接关闭,大多数 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 block 来关闭连接、语句和结果集(在本例中:Connection, 语句结果集)。

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

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

关于java - Java 项目的 Oracle 数据库连接不稳定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50783857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com