У меня есть Java-приложение со многими фрагментами кода, как в примере ниже. Очень простой запрос к базе данных Oracle. Верные данные возвращаются и анализируются, затем вызываются функции close ().
ResultSet rs = null;
Statement stmt = null;
try
{
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM example");
while (rs.next())
{
// do stuff
}
rs.close();
stmt.close();
System.out.println("test1");
}
catch (Exception e)
{
System.out.println("error1");
}
Я столкнулся с ошибкой "превышено максимальное количество курсоров". Я проверил свои методы, чтобы определить, не закрываются ли ResultSets. Предложение catch
никогда не срабатывало, и «test1» печатался каждый раз. Это означает, что строки rs.close () и stmt.close () НЕ пропускаются. И все же ResultSets на самом деле не закрываются.
Я добавил предложение finally
, и оно устранило проблему.
finally
{
if (rs != null)
{
try
{
rs.close();
System.out.println("test2");
}
catch (Exception e)
{
System.out.println("error2");
}
}
if (stmt != null)
{
try
{
stmt.close();
System.out.println("test3");
}
catch (Exception e)
{
System.out.println("error3");
}
}
}
ВЫВОД:
test1
test2
test3
Мой вопрос: почему rs.close () и stmt.close () должны вызываться дважды ? Вызовы в предложении try
, похоже, ничего не делают. И все же я снова их называю в предложении finally
, и они успешны. Как это возможно?