[英]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块(在本例中为Connection
, Statement
, ResultSet
),它关闭连接,语句和结果集。
方法processResultSet
声明了SQLException
因此不需要处理它。
代码经过重新排列,因此在代码离开try / catch块关闭连接之前,已对数据进行了完全处理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.