SQLDeveloper из Oracle 11g (64 bit) на Windows (64 bit)
При запуске sqldeveloper, который идёт в комплекте с Oracle 11G (11.2.0.4.0, 64bit) и установлен на Windows Server 2008 R2 (64 bit), получаем окно, в котором нас просят указать путь к java.exe. Однако, при указании пути к java, которая идёт вместе с Oracle или же к другой java 64 bit, ничего не происходит, кроме того, что снова появляется это же окно.
Если же пытаемся запустить «», то при указании пути к java получаем сообщение:
WARNING: Could not find jvm.cfg! in 'C:\app\oracle\product\11.2.0\dbhome_1\jdk\jre\lib\jvm.cfg'
Как ни парадоксально, но это решается установкой java 32-bit и добавлением в файл «» строки, в которой с помощью SetJavaHome задан JAVA_HOME (путь к java), например так:
SetJavaHome C:\app\Java\jdk1.7.0_76_32bit
SQL Test Case Builder
Быстро создать тестовый сценарий для отправки в службу поддержки Oracle можно в новом построителе сценариев тестирования SQL (SQL Test Case Builder). Этот инструмент предоставляет информацию о запросе SQL, определениях объектов, процедур, функций и пакетов, статистике оптимизатора и настройках параметров инициализации. SQL Test Case Builder создает сценарий SQL, который может выполняться в другой системе для воссоздания объектов базы, имеющихся в исходной базе. Вызывается SQL Test Case Builder с помощью функции . Эта функция сгенерирует тестовый сценарий SQL, соответствующий идентификатору инцидента, переданного функции. Вместо этого можно воспользоваться функцией и сгенерировать тестовый сценарий SQL, который соответствует тексту SQL, переданному в качестве аргумента. Однако обычно намного проще обратиться к SQL Test Case Builder со страницы Support Workbench в Enterprise Manager, выполнив для этого следующие шаги.
- Зайдите на страницу Problem Details (Детальная информация о проблеме), щелкнув на идентификаторе соответствующей проблемы.
- Щелкните на Oracle Support (Служба поддержки Oracle).
- Щелкните на Generate Additional Dumps and Test Cases (Сгенерировать дополнительные дампы и сценарии тестирования).
- Щелкните на пиктограмме в столбце Go to Task (Перейти к заданию) на странице Additional Dumps and Test Cases (Дополнительные дампы и сценарии тестирования). В результате будет запущен анализ SQL Test Case Builder для соответствующего оператора SQL.
Исправление ошибок ORA-06512
В Oracle ошибка ORA-06512 — это общая ошибка исключения, которая указывает, где что-то идет не так. Это одна из наименее специфических ошибок, производимых Oracle, поскольку она говорит вам только о том, что есть проблема, но не то, что идет не так.
Например, типичное сообщение об ошибке может выглядеть следующим образом:
«ORA-01422: точная выборка возвращает больше запрошенного количества строк
ORA-06512: в «DATABASE_NAME», строка 66
ORA-06512: в строке 1 ″
Первая строка сообщает вам, какой тип ошибки происходит, в этом случае запрос возвращает больше данных, чем ожидал запрос, поэтому он не знает, как ее обработать
Код «ORA-01422» — это фактический код ошибки, на который вам нужно обратить внимание. ORA-06512 — это просто общий код ошибки
Вторая строка сообщает вам, где происходит ошибка. DATABASE_NAME будет представлять собой базу данных, в которой вы работаете в данный момент. Строка 66 — это строка, в которой происходит ошибка, и строка, которую необходимо проверить, чтобы исправить ошибку.
Третья строка в синтаксисе ошибки сообщает вам, откуда поступил вызов. Проверьте первую строку, и вы увидите звонок DATABASE_NAME.
Чтобы исправить эту конкретную ошибку, вам нужно устранить проблему, вызванную ORA-01422, которая является «точным извлечением, возвращает больше, чем запрошенное количество строк», или вам нужно добавить обработчик исключений, чтобы сказать Oracle игнорировать его. Поскольку исправление основной проблемы всегда предпочтительнее, это путь.
Есть две вещи, которые вы можете сделать. Если вы ожидаете, что запрос вернет более одной строки, вы можете изменить его, чтобы он не удивился. Если вы ожидаете, что запрос вернет только одну строку, вы также можете изменить его.
Ожидается более одной строки:
для X в (выберите * из т, где …)
петля
— обработать X запись здесь
концевой цикл;
Это должно устранить ошибку в запросах к базе данных, когда будет возвращено более одной строки.
Если вы ожидаете, что будет возвращена только одна строка, вы можете попробовать:
начать
выберите * в …
откуда т …
процесс….
исключение
когда NO_DATA_FOUND тогда
код обработки ошибок, когда запись не найдена
когда TOO_MANY_ROWS тогда
код обработки ошибок при обнаружении слишком большого количества записей
конец;
Этот второй метод должен доставлять только одну строку, не выбрасывая ORA-01422: точная выборка возвращает ошибку, превышающую запрошенное количество строк, и, следовательно, исходную ошибку ORA-06512.
Вы также можете настроить запрос так, чтобы он возвращал только первую строку многострочного ответа. Это может сработать, если у вас нет полного контроля над базой данных или вы не хотите слишком много возиться с вещами, но вам все еще нужен ответ.
объявлять
c1 курсор для выбора * из т, где …
начать
открыть с1;
получить c1 в ..
if (c1% notfound) тогда
обработка ошибок для записи не найдена
конец если;
закрыть с1;
конец;
(Если вы знаете SQL, вы можете быть немного смущены этими командными строками … Oracle не использует Transact-SQL, а скорее является собственным процедурным языковым расширением SQL, PL / SQL. Хотя PL / SQL похож на Transact-SQL, много умных вещей и сам по себе очень мощный инструмент. Этот FAQ по PL / SQL может оказаться полезным при попытке узнать об Oracle.)
Таким образом, основной урок здесь заключается в том, что ошибка ORA-06512 сама по себе не является чем-то, что вы можете исправить напрямую. Вместо этого вы должны выяснить, что такое настоящая ошибка, о чем вам сообщат другие коды ошибок, а затем устранить эти ошибки одну за другой.
ORA-01075 you are currently logged on
ERROR: ORA-01075: you are currently logged on
нужно выполнить следующие шаги:
- подключаемся к системе под именем пользователя, от которого запущен Oracle;
- убеждаемся, что нет работающих Oracle-процессов ;
-
выполняем ipcs (должны получить нечто похожее):
$ ipcs ------ Сегменты совм. исп. памяти -------- ключ shmid владелец права байты nattch состояние 0x00000000 7241728 oracle 640 4096 0 0x00000000 7274497 oracle 640 4096 0 0x2683ca7c 7307266 oracle 640 4096 0 ------ Массивы семафоров -------- ключ semid владелец права nsems 0xde840770 14319618 oracle 640 176 0xde840771 14352387 oracle 640 176 0xde840772 14385156 oracle 640 176 0xde840773 14417925 oracle 640 176 0xde840774 14450694 oracle 640 176
-
«убиваем» совместные сегменты памяти и семафоры
-
для сегментов памяти:
ipcrm -m <shmid из предыдущего шага>
-
для семафоров:
ipcrm -s <shmid из предыдущего шага>
-
для сегментов памяти:
- пробуем подключиться.
Закрытие объектов JDBC
Типичный пример выполнения ResultSet:
Обратите внимание, как предложение finally игнорирует любое исключение, вызванное close ():
- Если вы просто закроете ResultSet без try {} catch {}, он может выйти из строя и помешать закрытию оператора
- Мы хотим, чтобы любое исключение, возникшее в теле попытки, передавалось вызывающему. Если у вас есть цикл, например, создание и выполнение операторов, не забудьте закрыть каждый оператор в цикле.
В Java 7 Oracle представила интерфейс AutoCloseable, который заменяет большую часть стандартного кода Java 6 некоторым приятным синтаксическим сахаром.
Закрытие объектов JDBC
Типичный пример выполнения ResultSet:
Обратите внимание, как предложение finally игнорирует любое исключение, вызванное close ():
- Если вы просто закроете ResultSet без try {} catch {}, он может выйти из строя и помешать закрытию оператора
- Мы хотим, чтобы любое исключение, возникшее в теле попытки, передавалось вызывающему. Если у вас есть цикл, например, создание и выполнение операторов, не забудьте закрыть каждый оператор в цикле.
В Java 7 Oracle представила интерфейс AutoCloseable, который заменяет большую часть стандартного кода Java 6 некоторым приятным синтаксическим сахаром.
Automatic Diagnostic Repository
Экземпляры базы данных, подобно другим продуктам и компонентам Oracle, хранят различные типы диагностических данных в ADR. К ADR можно обратиться всегда, даже при остановленном экземпляре, что позволяет некоторым сравнивать ADR с черным ящиком самолета, который позволяет диагностировать причины авиакатастрофы.
Местоположение ADR настраивается с помощью параметра инициализации . Установка этого параметра означает, что вам не придется устанавливать такие традиционные параметры инициализации, как .
Если опустить параметры , то база данных назначит местоположение базового репозитория ADR так, как описано ниже.
- Если установлена переменная , то базой ADR станет каталог, который был назначен для .
- Если переменная не установлена, то значением параметра по умолчанию станет
Параметр устанавливает местоположение базы ADR на сервере. Домашний каталог ADR настраивается для каждого индивидуального экземпляра базы данных. База ADR может состоять из множества домашних каталогов ADR, по одному для каждого экземпляра продукта Oracle.
Домашний каталог ADR связан с базой ADR. Вот как выглядит общая структура домашнего каталога ADR, начиная с базы ADR:
diag/product_type/product_id/instance_id
Итак, если ваша база данных имеет имя и SID-идентификатор , а базой ADR является, то домашний каталог ADR для базы будет выглядеть так:
/u01/app/oracle/diag/rdbms/orcl1/orcl1
Структура ADR
Различные подкаталоги домашнего каталога ADR содержат различные типы диагностических данных, вроде журналов сигналов тревоги, отчетов , отчетов об инцидентах и файлов трассировки ошибок
Обратите внимание, что в Oracle Database 11g есть два типа журналов сигналов тревоги: нормальный текстовый файл и журнал в формате XML. Для просмотра различных подкаталогов ADR экземпляра можно опросить представление :
SQL> select * from v$diag_info; INST_ID NAME VALUE ------- -------------- ---------------------------------------------- 1 Diag Enabled TRUE 1 ADR Base /u01/app/oracle 1 Diag Trace /u01/app/oracle/diag/rdbms/orcl2/orcl2/trace 1 Diag Alert /u01/app/oracle/diag/rdbms/orcl2/orcl2/alert 1 Diag Incident /u01/app/oracle/diag/rdbms/orcl2/orcl2/incident 1 Diag Cdump /u01/app/oracle/diag/rdbms/orcl2/orcl2/cdump 1 Health Monitor /u01/app/oracle/diag/rdbms/orcl2/orcl2/hm1 1 Def Trace File /u01/app/oracle/diag/rdbms/orcl2/orcl2/trace /orcl2_ora_4813.trc 1 Active Problem Count 2 1 Active Incident Count 4 11 rows selected. SQL>
Следующие каталоги требуют пояснений:
- — базовый каталог ADR;
- — домашний каталог ADR для экземпляра;
- — содержит текстовый журнал сигналов тревоги;
- — содержит журнал сигналов тревоги в формате XML;
- — каталог, содержащий созданные вами пакеты инцидентов.
SP2-1503/SP2-0152
Windows Server 2003 R2 с установленным на нём Oracle Client 10.2.0.4.
При запуске sqlplus от имени пользователя с
администраторскими полномочиями коннект осуществляется без проблем. Но при попытке подключиться к базе от имени пользователя без
администраторских полномочий появляется ошибка:
SP2-1503: Невозможно инициализировать интерфейс вызовов Oracle SP2-0152: Возможно, ORACLE функционирует неправильно
Вызвано это невозможностью создать global object пользователем без администраторских полномочий. Я решил проблему так:
- Создал группу (имя группы, в данном случае, значения не имеет);
- Ввёл в эту группу всех пользователей, которым нужно работать с Oracle Client;
- Пуск, Администрирование, Локальная политика безопасности;
- В списке слева находим и разворачиваем «Локальные политики»;
- Переходим на «Назначение прав пользователя»;
- В списке справа находим «Создание глобальных объектов» и открываем его двойным щелчком мыши;
- Щёлкаем на «Добавить пользователя или группу…», затем на «Типы объектов…», ставим галочку против «Группы» и нажимаем «Ок»;
- В поле «Введите имена выбираемых объектов» вводим имя группы в нотации (). Можно нажать на кнопку «Проверить имена»;
- Далее — «Ок», и снова — «Ок»;
- Просим пользователей перелогиниться в системе.
Результат — ошибок нет, пользователь счастлив и может работать.
Другие мысли
Можете ли вы использовать WeakReferences для обработки закрывающихся соединений?
Слабые и мягкие ссылки — это способы, позволяющие вам ссылаться на объект таким образом, который позволяет JVM собирать мусор для референта в любое время, которое она сочтет подходящим (при условии, что на этот объект нет сильных цепочек ссылок).
Если вы передаете ReferenceQueue в конструкторе мягкой или слабой ссылке, объект помещается в ReferenceQueue, когда объект GC’ed, когда это происходит (если это происходит вообще). При таком подходе вы можете взаимодействовать с финализацией объекта, и вы можете закрыть или финализировать объект в этот момент.
Фантомные ссылки немного страннее; их цель — только контролировать финализацию, но вы никогда не сможете получить ссылку на исходный объект, поэтому будет сложно вызвать для него метод close ().
Однако попытка управления запуском GC редко бывает хорошей идеей (Weak, Soft и PhantomReferences сообщают вам после того , как объект поставлен в очередь для GC). Фактически, если объем памяти в JVM велик (например, -Xmx2000m), вы, возможно, никогда не соберете объект GC, и вы все равно столкнетесь с ORA-01000. Если память JVM мала по сравнению с требованиями вашей программы, вы можете обнаружить, что объекты ResultSet и PreparedStatement собираются сразу после создания (до того, как вы сможете их читать), что, вероятно, приведет к сбою вашей программы.
ORA-00392: log 1 of thread 1 is being cleared, operation not allowed
При открытии БД с resetlogs получаем ошибку:
SQL> ALTER DATABASE open resetlogs; ALTER DATABASE open resetlogs * ERROR at line 1: ORA-00392: log 1 of thread 1 IS being cleared, operation NOT allowed ORA-00312: online log 1 thread 1: '/opt/oracle/oradata/lsyb/redo01a.log'
Вероятно, первая команда «» завершилась неудачно и в control-файле redo остались в статусе CLEARING/CLEARING_CURRENT:
SQL> SELECT GROUP#,THREAD#,SEQUENCE#,MEMBERS,ARCHIVED,STATUS,FIRST_CHANGE# from v$log order by first_change# ; GROUP# THREAD# SEQUENCE# MEMBERS ARCHIVED STATUS FIRST_CHANGE# --------------- --------------- --------------- --------------- --------- ------------------ --------------- 2 1 2 YES CLEARING 6434801030343 3 1 2 YES CLEARING 6434801030352 1 1 2 NO CLEARING_CURRENT 6434801030360
Можно попробовать использовать следующие команды:
SQL> ALTER DATABASE clear unarchived logfile GROUP 1 ; DATABASE altered. SQL> ALTER DATABASE clear unarchived logfile GROUP 2 ; DATABASE altered. SQL> ALTER DATABASE clear unarchived logfile GROUP 3 ; DATABASE altered.
а затем уже повторить:
SQL> ALTER DATABASE open resetlogs; DATABASE altered.
На metalink есть документ (Doc ID 1352133.1)
Хранение объектов JDBC
Объекты JDBC можно безопасно хранить в локальных переменных, экземплярах объекта и членах класса. Как правило, лучше:
- Используйте экземпляр объекта или члены класса для хранения объектов JDBC, которые повторно используются несколько раз в течение более длительного периода, например Connections и PreparedStatements.
- Используйте локальные переменные для ResultSets, поскольку они получаются, зацикливаются и затем закрываются, как правило, в рамках одной функции.
Однако есть одно исключение: если вы используете EJB или контейнер сервлетов / JSP, вы должны следовать строгой модели потоковой передачи:
- Только сервер приложений создает потоки (с которыми он обрабатывает входящие запросы)
- Только сервер приложений создает соединения (которые вы получаете из пула соединений)
- При сохранении значений (состояния) между вызовами нужно быть очень осторожным. Никогда не храните значения в ваших собственных кэшах или статических элементах — это небезопасно для кластеров и других странных условий, а сервер приложений может творить ужасные вещи с вашими данными. Вместо этого используйте компоненты с отслеживанием состояния или базу данных.
- Особенно, никогда удерживать объекты JDBC (Connections, ResultSets, PreparedStatements и т. д.) при различных удаленных вызовах — позвольте серверу приложений управлять этим. Сервер приложений не только предоставляет пул соединений, но и кэширует ваши PreparedStatements.
SQL Developer, Oracle XE и ORA-12705 в Linux
При попытке из SQL Developer в Linux подключиться к СУБД Oracle XE наткнулся на ошибку «ORA-12705: Cannot access NLS data files or invalid environment specified.» Выяснилось, что не обошлось без «особенностей» java, а именно: при запуске приложения, java считывает значение переменной LANG и при LANG=ru_RU.UTF-8 (проверенно) мы получаем ORA-12705. Решение: менять значение переменной LANG, например, на POSIX. Я теперь запускаю так:
LANG=POSIX /opt/oracle/product/11.2.0/client_1/sqldeveloper/sqldeveloper.sh
-Duser.language=en -Duser.region=en
У меня содержимое файла выглядит так:
export JAVA_OPTS="$JAVA_OPTS -Duser.language=en -Duser.region=en"
Certificate of the remote server does not match the target address.
Эта заметка относится к Oracle Database 12.2.
В wallet-файле есть необходимый сертификат, но при обращении к ресурсу получаем ошибку:
> SELECT substr(utl_http.request('https://www.habr.com', NULL, 'file:/home/oracle/last_used_wallet', 'pwdtst123'),1,50) r FROM dual; SELECT substr(utl_http.request('https://www.habr.com', NULL, 'file:/home/oracle/last_used_wallet', 'pwdtst123'),1,50) r FROM dual * ERROR at line 1: ORA-29273: HTTP request failed ORA-06512: at "SYS.UTL_HTTP", line 1501 ORA-24263: Certificate of the remote server does NOT match the target address. ORA-06512: at "SYS.UTL_HTTP", line 380 ORA-06512: at "SYS.UTL_HTTP", line 1441 ORA-06512: at line 1
В utl_http.request в данном релизе добавили аргумент «», который должен соответствовать CN из SSL-сертификата и который выручает, когда адрес сайта отличается от адреса, на который был выпущен сертификат. Однако, firefox, например, не даёт информации о CN (или я не знаю где искать), потому пришлось задействовать openssl:
$ openssl s_client -showcerts -connect habr.com:443 < devnull 2>/devnull | sed -n -e '/ 0 s:/ s/.*CN=\(.*\)/\1/p' habrahabr.ru
«» и есть то значение, которое необходимо подставить:
> SELECT substr(utl_http.request('https://www.habr.com', NULL, 'file:/home/oracle/last_used_wallet', 'pwdtst123',https_host=>'habrahabr.ru'),1,50) r FROM dual; R ------------------------------------------------------- <!DOCTYPE html> <html lang="ru" class="no-js"> <
Ещё один широко известный в узких кругах ресурс:
$ openssl s_client -showcerts -connect bash.im:443 < devnull 2>/devnull | sed -n -e '/ 0 s:/ s/.*CN=\(.*\)/\1/p' app42.lolwut.it
> SELECT substr(utl_http.request('https://bash.im', NULL, 'file:/home/oracle/last_used_wallet', 'pwdtst123',https_host=>'app42.lolwut.it'),1,50) r FROM dual; R ------------------------------------------------------- <!doctype html> <html id="godtier"> <head> <title
Устранение утечек
Существует ряд процессов и инструментов, помогающих обнаруживать и устранять утечки JDBC:
Во время разработки — безусловно, лучший подход — выявление ошибок на раннем этапе:
Практика разработки: Хорошая практика разработки должна уменьшить количество ошибок в вашем программном обеспечении, прежде чем оно покинет рабочий стол разработчика. Конкретные практики включают: Парное программирование для обучения тех, у кого нет достаточного опыта Кодовые обзоры, потому что многие глаза лучше, чем один Модульное тестирование, что означает, что вы можете протестировать любую и всю свою кодовую базу с помощью инструмента тестирования, что упрощает воспроизведение утечек. Используйте существующие библиотеки для пула соединений, а не создавайте свои собственные Статический анализ кода: используйте инструмент, подобный отличному Findbugs, для выполнения статического анализа кода. Это обнаруживает многие места, где close () не обрабатывалась правильно. У Findbugs есть плагин для Eclipse, но он также работает автономно для разовых работ, имеет интеграцию с Jenkins CI и другими инструментами сборки.
Во время выполнения:
Удерживаемость и фиксация Если ResultSet удерживается ResultSet.CLOSE_CURSORS_OVER_COMMIT, то ResultSet закрывается при вызове метода Connection.commit (). Это можно установить с помощью Connection.setHoldability () или с помощью перегруженного метода Connection.createStatement ().
Ведение журнала во время выполнения. Поместите в код хорошие операторы журнала. Они должны быть четкими и понятными, чтобы заказчик, вспомогательный персонал и товарищи по команде могли понять их без обучения. Они должны быть краткими и включать печать состояния / внутренних значений ключевых переменных и атрибутов, чтобы вы могли отслеживать логику обработки. Хорошее ведение журнала является основополагающим для отладки приложений, особенно тех, которые были развернуты.
Вы можете добавить отладочный драйвер JDBC в свой проект (для отладки — фактически не развертывайте его). Один из примеров (я его не использовал) — log4jdbc. Затем вам нужно провести простой анализ этого файла, чтобы увидеть, какие из выполнений не имеют соответствующего закрытия. Подсчет количества открытых и закрытых окон должен выявить потенциальную проблему. Мониторинг базы данных. Наблюдайте за своим запущенным приложением с помощью таких инструментов, как функция SQL Developer ‘Monitor SQL’ или Quest’s TOAD. Мониторинг описан в этой статье. Во время мониторинга вы запрашиваете открытые курсоры (например, из таблицы v $ sesstat) и просматриваете их SQL
Если количество курсоров увеличивается и (что наиболее важно) преобладает один идентичный оператор SQL, вы знаете, что у вас есть утечка с этим SQL. Найдите свой код и просмотрите
Связь JDBC в JVM с курсорами в БД
Приведенные ниже объекты JDBC тесно связаны со следующими концепциями базы данных:
- JDBC Подключение это клиентское представление базы данных сессия и предоставляет базу данных сделки. Соединение может иметь только одну открытую транзакцию одновременно (но транзакции могут быть вложенными)
- JDBC ResultSet поддерживается единым курсор в базе данных. Когда для ResultSet вызывается close (), курсор отпускается.
- JDBC CallableStatement призывает хранимая процедура в базе данных, часто пишется на PL / SQL. Хранимая процедура может создавать ноль или более курсоров и может возвращать курсор в виде набора результатов JDBC.
JDBC является потокобезопасным: вполне нормально передавать различные объекты JDBC между потоками.
Например, вы можете создать соединение в одном потоке; другой поток может использовать это соединение для создания PreparedStatement, а третий поток может обработать набор результатов. Единственное серьезное ограничение заключается в том, что вы не можете одновременно открывать более одного ResultSet на одном PreparedStatement. См. Поддерживает ли база данных Oracle несколько (параллельных) операций на одно соединение?
Обратите внимание, что фиксация базы данных происходит в соединении, и поэтому все DML (INSERT, UPDATE и DELETE) в этом соединении будут фиксироваться вместе. Следовательно, если вы хотите поддерживать несколько транзакций одновременно, у вас должно быть хотя бы одно соединение для каждой параллельной транзакции
ORA-01000: анализ и решение максимального количества проблем, которые открывают курсор
y http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>le=»margin-bottom:5px;»>Теги: ORA-01000: анализ и решение максимального количества проблем, которые открывают курсор
Симптом: система была запускается в течение периода ошибки: Java.sql.sqlexception: ORA-01000: максимальное количество открытых курсоров
step 2:
Просмотр использования курсора:
В здесь user_name = «Пользователь» пользователь представляет имя пользователя базы данных, которая занимает ресурс базы данных.
step 4:
Согласно размещению курсора, программа для доступа к базе данных является нормальной в выпуске ресурсов. Если программа выпускает ресурс, не проблема, количество курсоров увеличивается.
Дополнение: в коде Java, выполнитеиВ то время на самом деле довольно достаточно, чтобы открыть курсор в базе данных. В частности, если ваше создание и препарат находятся в цикле, эта проблема очень проста. Поскольку курсор был открыт для открытия, и нет закрытия. В общем, когда мы пишем код Java, CreateStation и препарата должны быть размещены за пределами петли, а после использования этих статусов закрыть его во времени. Лучше всего выполнять executewhery, executeupdate и т. Д., Если вам не нужно использовать набор результатов (Resultset), немедленно выключите метод STASE () сразу, вызовите метод close ().
Интеллектуальная рекомендация
1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…
Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…
package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…
Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …
тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …
Вам также может понравиться
D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…
Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…
calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…
Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…
Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …
Использование процедуры TRANSACTION_BACKOUT
В следующем примере показано, как использовать процедуру TRANSACTION_BACKOUT для выполнения ретроспективной отмены транзакции. Прежде чем выполнять эту процедуру, нужно сначала создать переменную типа XID_ARRAY для хранения набора идентификаторов транзакций:
declare trans_arr xid_array; begin trans_arr := xid_array('030003000D02540','D10001000D02550'); dbms_flashback.transaction_backout ( numtxns => 1, xids => trans_arr, options => dbms_flashback.nocascade ); end;
Приведенный выше код выполняет ретроспективную отмену главных и зависимых транзакций за один шаг. Для выполнения ретроспективной отмены транзакций также можно пользоваться интерфейсом Enterprise Manager.
Что такое курсор?
Курсор — это ресурс в базе данных, который хранит состояние запроса, в частности позицию, в которой читатель находится в ResultSet. У каждого оператора SELECT есть курсор, и хранимые процедуры PL / SQL могут открывать и использовать столько курсоров, сколько им требуется. Вы можете узнать больше о курсорах на Orafaq.
Экземпляр базы данных обычно обслуживает несколько разных схемы, много разных пользователи каждый с несколько сеансов. Для этого у него есть фиксированное количество курсоров, доступных для всех схем, пользователей и сеансов. Когда все курсоры открыты (используются) и поступает запрос, требующий нового курсора, запрос завершается ошибкой ORA-010000.
3 ответа
Лучший ответ
Механизм обработки по умолчанию
При вызове метода в JPA или в Hibernate Hibernate выполняет следующие действия:
Обратите внимание, что JDBC подготовлен и сохранен в связанном объекте. При вызове метода Hibernate будет использовать базовый для извлечения параметра
Теперь по умолчанию закрывается после завершения текущей выполняемой транзакции базы данных, либо путем вызова или .
Закрытие заявления JDBC как можно скорее
Поэтому, чтобы закрыть JDBC как можно скорее, вы должны вызвать после извлечения всех данных, которые вы хотели получить из хранимой процедуры:
Вызов метода для связанного объекта в блоке обеспечивает закрытие JDBC независимо от результата вызова хранимой процедуры.
Спящий 6 лет
Теперь вызывать вручную немного утомительно, поэтому я решил создать HHH -13215 Проблема Jira, которая, начиная с Hibernate ORM 6 и далее, позволяет переписать предыдущий пример следующим образом:
4
Vlad Mihalcea
14 Фев 2019 в 12:44
В конце концов я нашел решение, я заменил линию
С участием
Согласно документации: «Когда executeUpdate вызывается для объекта StoredProcedureQuery, провайдер будет вызывать execute для неисполненного запроса хранимой процедуры, за которым следует getUpdateCount. Результатами executeUpdate будут результаты getUpdateCount»
Но они ничего не сказали о закрывающих курсорах, но мой метод сейчас работает хорошо.
2
Lev
14 Май 2018 в 02:24
Вот мое решение:
1
Antonio Petricca
7 Июн 2018 в 17:22