Исключение говорит вам, что Statement
, который возвратил это ResultSet
, был закрыт, пока вы пытаетесь выполнить итерацию по ResultSet
. Это указывает на то, что вы используете ResultSet
вне блока try
, где был выполнен Statement
, и что вы, вероятно, используете ResultSet
в качестве возвращаемого значения метода. Это плохая практика .
Я бы предложил вам переписать код JDBC так, чтобы ResultSet
обрабатывался в том же блоке try
, что и Statement
, или чтобы методы возвращали что-то вроде List<Entity>
вместо ResultSet
.
Вот пример правильной идиомы JDBC:
public List<Entity> list() throws SQLException {
// Declare resources.
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
List<Entity> entities = new ArrayList<Entity>();
try {
// Acquire resources.
connection = database.getConnection();
statement = connection.createStatement("SELECT id, name, value FROM entity");
resultSet = statement.executeQuery();
// Gather data.
while (resultSet.next()) {
Entity entity = new Entity();
entity.setId(resultSet.getLong("id"));
entity.setName(resultSet.getString("name"));
entity.setValue(resultSet.getInteger("value"));
entities.add(entity);
}
} finally {
// Close resources in reversed order.
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
// Return data.
return entities;
}
Кстати, вам здесь не нужны классы / методы, специфичные для драйвера JDBC Oracle. Это всего лишь java.sql.*
. Таким образом вы сохраняете код JDBC переносимым среди баз данных.