java, jdbc и oracle - превышено максимальное количество открытых курсоров - PullRequest
4 голосов
/ 18 декабря 2011

У меня есть некоторый код JDBC, который извлекает данные из Oracle.

В моем методе я использую подготовленное утверждение, однако я не закрываю это подготовленное утверждение. Чтобы проверить это, я запустил это в цикле и, конечно же, получил исключение:

ORA-01000: maximum open cursors exceeded

Мой вопрос относится к управляемой среде (код, развернутый на сервере приложений Java EE с использованием пулов соединений):

  • Что происходит с приложением?
  • Не сможет ли он запустить какой-либо SQL-запрос к базе данных, если соединение не будет закрыто / переработано? (предположим, что в пуле только 1 соединение)

Я предполагаю, что соединения в пуле на самом деле не закрыты - сеанс оракула будет жив.

Ответы [ 3 ]

5 голосов
/ 18 декабря 2011

Вам необходимо закрыть объекты ResultSet, возвращаемые при выполнении запроса. И чтобы убедиться, что вы не пропускаете курсоры, вам нужно сделать это в блоке finally. Я считаю, что это относится и к управляемой среде.

2 голосов
/ 13 марта 2013

Вы ДОЛЖНЫ закрыть подготовленный оператор, иначе вы не сможете выполнить больше запросов.

Предположим, у вас есть:

        PreparedStatement ps = conn.prepareStatement("select * from my_table");
        ps.execute();
        ps.close();

Вы должны выполнить ps.close, чтобы избежать этой проблемы. И, как я сказал @Stephen, также закройте ResultSet.

    ResultSet rs = ps.executeQuery();

    rs.close();
    ps.close();
1 голос
/ 18 декабря 2011

Максимальная ошибка открытых курсоров генерируется в базе данных Oracle.Это база данных, которая имеет этот предел.Приложение продолжит отправлять запросы, но база данных вернет ошибку.

Когда превышено максимальное количество открытых курсоров, приложение (то есть клиент) может продолжать отправлять запросы в базу данных, но база данных будет просто отклонять запрос до тех пор, пока открытые курсоры не будут закрыты.

Вы можете увеличить разрешенные открытые курсоры, используя что-то вроде

“ALTER SYSTEM SET OPEN_CURSORS=2000 SID=’DUMMY’”;

Но вышеизложенное не решает проблему.Чтобы исправить это, вам нужно закрыть ваши соединения / результирующие наборы / PreparedStatements и т. Д.

Один из возможных сценариев, когда ваш сервер приложений не сможет отправлять запросы SQL, - это если число разрешенных активных соединений в вашем пуле соединений меньшечем количество соединений базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...