Java-项目的 Oracle 数据库连接不稳定
Unstable Oracle Database connection for Java-project
我是一名学生,我们的一项作业是在本地 GlassFish 5 网络服务器上创建一个 Java 网络项目。用于此项目的数据库是 OracleDB 运行 本地 Docker 容器中。
我几乎完成了我的项目,但有些页面不断崩溃(NullPointerException)。我必须检索数据库记录并将它们保存在 ArrayList 中。但有时 SQLConnection 没有 return 任何东西(但记录确实存在)并且我的代码试图在那个空的 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:no 已找到合适的服务处理程序
但是我真的不明白我现在应该做什么..
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 也会关闭该语句。
所以关闭连接是最重要的部分。使用您当前的代码结构无法实现它,因为您是在内部方法中创建它而不是 return 它。
也有人提到异常处理很差,因为您忽略了异常,return 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 块关闭连接、语句和结果集(在本例中:Connection
、Statement
, ResultSet
).
方法 processResultSet
声明了 SQLException
所以它不需要处理它。
重新排列代码,以便在代码离开关闭连接的 try/catch 块之前完全处理数据。
我是一名学生,我们的一项作业是在本地 GlassFish 5 网络服务器上创建一个 Java 网络项目。用于此项目的数据库是 OracleDB 运行 本地 Docker 容器中。
我几乎完成了我的项目,但有些页面不断崩溃(NullPointerException)。我必须检索数据库记录并将它们保存在 ArrayList 中。但有时 SQLConnection 没有 return 任何东西(但记录确实存在)并且我的代码试图在那个空的 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:no 已找到合适的服务处理程序
但是我真的不明白我现在应该做什么..
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 也会关闭该语句。
所以关闭连接是最重要的部分。使用您当前的代码结构无法实现它,因为您是在内部方法中创建它而不是 return 它。
也有人提到异常处理很差,因为您忽略了异常,return 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 块关闭连接、语句和结果集(在本例中:Connection
、Statement
, ResultSet
).
方法 processResultSet
声明了 SQLException
所以它不需要处理它。
重新排列代码,以便在代码离开关闭连接的 try/catch 块之前完全处理数据。