Есть ли способ узнать, открыт ли курсор в базе данных или нет в Java? - PullRequest
1 голос
/ 30 апреля 2010

Есть ли способ в JDBC узнать, открыт курсор или нет в JAVA. Мы получаем исключение при попытке доступа к неоткрытому курсору. java.sql.SQLException: курсор закрыт.

Вот что происходит.

Хранимый процесс разработан таким образом. proc возвращает курсор и пару других столбцов. Для некоторых условий парень БД не открывает курсор и возвращает только другой оставшийся столбец за пределами курсора. Поэтому, когда код Java пытается получить курсор, он выдает это исключение. Я знаю, что могу поймать исключение и продолжить работу с оставшимися столбцами. Но мне было интересно, есть ли другой (может быть лучше) способ справиться с этим? Или просто нужно открыть курсор в сохраненном процессе, даже если нечего вернуть как часть курсора?

Ответы [ 5 ]

2 голосов
/ 30 апреля 2010

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

TYPE tCursor IS REF CURSOR;

PROCEDURE A_PROC(returned_cursor    OUT tCursor,
                 bCursor_is_open    OUT BOOLEAN,
                 aNother_value      OUT NUMBER,
                 yet_another_value  OUT NUMBER);

Процедура должна установить для bCursor_is_open значение ИСТИНА, если она открывает курсор, или ЛОЖЬ, если курсор не открыт.

2 голосов
/ 30 апреля 2010

Я сталкивался с этой проблемой в Oracle раньше.Это не имеет ничего общего с ResultSet, оно открыто.Ошибка вызвана STP, который может вернуть пустой курсор или закрыть курсор при определенных условиях.

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

1 голос
/ 30 апреля 2010

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

Просмотрите поток в своем коде JDBC.Убедитесь, что он соответствует стандартным идиомам JDBC, описанным в руководстве Sun .Чтобы узнать больше о том, как правильно использовать базовый JDBC, вам может пригодиться эта статья .

1 голос
/ 30 апреля 2010

Начиная с версии 1.6, ResultSet имеет метод isClosed . Я предполагаю, что ваше исключение происходит в ResultSet. При этом, я согласен с другими ответами, что если вы видите, что ваш ResultSet закрывается из-под вас, у вас, вероятно, есть недостаток в использовании, и просто тестирование на isClosed не поможет вам выйти из этой проблемы - вы просто обнаружите, что он закрыт, когда вам нужно его открыть.

1 голос
/ 30 апреля 2010

Это означает, что вы неправильно обрабатываете свой ResultSet. (ResultSet - это объектное представление курсора.)

Не беспокойтесь о том, как выяснить, открыт ли курсор или нет; выясните, почему ваш ResultSet вышел из области видимости, и вы ответите на свой вопрос.

Разместите некоторый код или более подробное объяснение того, что происходит.

Я предполагаю, что вы передаете ResultSet из уровня персистентности, когда вам будет намного лучше сопоставить его с объектом или коллекцией и закрыть его в области действия метода. Верните этот объект или коллекцию вместо ResultSet.

Курсоры базы данных - это ограниченные ресурсы. Вы должны держать их открытыми в течение минимального времени, необходимого для получения ваших данных, а затем закрыть их, чтобы кто-то другой мог их использовать. Это поможет с масштабируемостью - и решит это исключение как побочное преимущество.

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