barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

четверг, 21 декабря 2017 г.

Узнать SID сессии по database link

Проблема

Есть БД "А" и БД "Б", в первой создан DATABASE LINK ко второй. Нужно запросом к БД "А" узнать идентификатор сессии (SID) между БД "А" и БД "Б".

Решение

Из всех опробованных вариантов заработал только этот:
select
   to_number(substr(dbms_session.unique_session_id@DBLINK_NAME,1,4),'XXXX') mysid
from dual;
, где DBLINK_NAME - имя DATABASE LINK'а.

четверг, 23 ноября 2017 г.

Oracle DB: определение размера MATERIALIZED VIEW

Следующий запрос возвращает размеры (в Мб) всех материализованных представлений в БД:
SELECT segment_name,sum((BYTES)/(1024*1024)) "Allocated(MB)"
FROM dba_extents
WHERE segment_name in (SELECT mview_name FROM dba_mviews)
GROUP BY segment_name ;
Спасибо http://javeedkaleem.blogspot.ru/2010/04/find-space-used-by-materialized-views.html.

понедельник, 13 ноября 2017 г.

ORA-02020: используется слишком много каналов связи БД

Проблема

Есть ADF-приложение, в нем некоторые Entity смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK. При работе с этими Entity падает ошибка:
ORA-02020: используется слишком много каналов связи БД

Решение

Срабатывает ограничение OPEN_LINKS (ограничение на число link-ов в рамках одной сессии, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams139.htm#REFRN10138) или OPEN_LINKS_PER_INSTANCE (тоже самое, но не на уровне сессии, а глобально, актуально при использовании SHARED-линков и распределенных транзакций, см. https://docs.oracle.com/cd/B19306_01/server.102/b14237/initparams140.htm#REFRN10139). Оба по-умолчанию равны 4. Посмотреть текущие значения можно SQL-запросом:
show parameter OPEN_LINKS
Необходимо поменять значения командами:
ALTER SYSTEM SET OPEN_LINKS=255 SCOPE=SPFILE;
ALTER SYSTEM SET OPEN_LINKS_PER_INSTANCE=255 SCOPE=SPFILE; 
(для применения потребуется рестартануть БД)

воскресенье, 12 ноября 2017 г.

ORA-24777: использование непереносимых ссылок на базы данных недопустимо

Проблема

Есть ADF-приложение, работающее на weblogic. Приложение использует Data source, предоставляемый weblogic'ом, для соединения с БД. Некоторые Entity приложения смотрят на вьюхи, которые, в свою очередь, смотрят на удаленные таблицы через DATABASE LINK.
При попытке приложения обратиться к данным в удаленной БД падает ошибка:
ORA-24777: использование непереносимых ссылок на базы данных недопустимо
Решение

Data source на weblogic использует JDBC-драйвер "oracle.jdbc.xa.client.OracleXADataSource, либо обычный (non-XA) драйвер oracle.jdbc.OracleDriver, но в настройках датасорса стоит галочка "Supports Global Transactions" (которая, кстати, установлена там по-умолчанию). При этом DATABASE LINK создан не как SHARED.
Соответственно, варианта 2:
  1. Использовать oracle.jdbc.OracleDriver со снятой галочкой "Supports Global Transactions", если распределенные транзакции по факту приложению не нужны
  2. Пересоздать DATABASE LINK с использованием SHARED-опции (подробнее см. https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_5005.htm#i2061693).  Например:
CREATE SHARED PUBLIC DATABASE LINK MY_DBLINK
CONNECT TO "USR1" IDENTIFIED BY "PSWRD1"
AUTHENTICATED BY "USR1" IDENTIFIED BY "PSWRD1"
USING 'MYRMTORCL';

пятница, 20 октября 2017 г.

JDeveloper не запускает приложение на встроенном weblogic

Проблема

Есть JDeveloper 12c, и все было ок - приложение собиралось и запускалось на встроенном weblogic. Но в один прекрасный день этому пришел конец: weblogic стартует, а вот приложение на него не деплоится. И никаких ошибок, просто не деплоится - и всё. В левом нижнем углу окна JDev висит "Starting IntegratedWebLogicServer", хотя по логу запуска видно, что weblogic уже запустился, да и его console доступна в браузере. 
Перезагрузка машины, пересоздание default-ного домена weblogic - ничего не помогало.

Решение

Так и не понял, что это было, но если грохнуть C:\Users\<username>\AppData\Roaming\JDeveloper  - то все приходит в норму. Да, JDev теряет все пользовательские настройки, зато деплой начинает работать.

пятница, 29 сентября 2017 г.

Запуск Tomcat 8 из Netbeans 8.2 и Netbeans 10.0: ошибка "Не удается найти указанный файл"

Проблема

Установил Netbeans 8.2 вместе с Tomcat 8, пробую запустить Tomcat из Netbeans. В выводе старта томката получаю ошибку:
Using CATALINA_BASE:   "C:\Users\aspirinspb\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0.27.0_base"
Using CATALINA_HOME:   "C:\tomcat-8.0.27"
Using CATALINA_TMPDIR: "C:\Users\aspirinspb\AppData\Roaming\NetBeans\8.2\apache-tomcat-8.0.27.0_base\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk1.7.0_80"
Using CLASSPATH:       "C:\tomcat-8.0.27\bin\bootstrap.jar;C:\tomcat-8.0.27\bin\tomcat-juli.jar"
Не удается найти указанный файл
(на самом деле вместо  "Не удается найти указанный файл" были кракозябры, это уже расшифрованная фраза, спасибо https://2cyr.com/decode/?lang=ru).
Та же проблема наблюдается на Netbeans 10.0 с тем же Tomcat 8.

Причина

Причина в настройках прокси-сервиса, установленных в IE. Дело в том, что в Netbeans по-умолчанию установлена настройка "Использовать системные настройки прокси". А в них у меня задано исключение из проксируемых адресов по маске: "*.domain.ru;172.26.*". В итоге Netbeans формирует следующий параметр для старта томката:
-Dhttp.nonProxyHosts=*.domain.ru^|172.26.*^|<local> 
Что и вызывает невнятную ошибку  "Не удается найти указанный файл". Пока просто отключил использование прокси в настройках Netbeans.

вторник, 26 сентября 2017 г.

Oracle Database11g Express Edition: "ORA-12505, TNS:listener does not currently know of SID given in connect descriptor"

Установил я Oracle Database11g Express Edition Release 2 на Win 10 x64. Проблемы начались еще при скачивании дистрибутива. Сайт Oracle ругался на Unauthorized Request "In order to download products from Oracle Technology Network you must agree to the OTN license terms", хотя я, естественно, условия лицензии принял. Пришлось качать с rutracker. Наконец поставив, пытаюсь подключиться через JDeveloper по jdbc:oracle:thin:@localhost:1521:XE. Получаю:
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
Тоже самое через cmd с помощью:
sqlplus sys/******@XE as sysdba
Вроде бы службы запущены, "Start Database" в меню Пуск я нажимал. Перезапуск служб не помог (хотя вроде бы стартовал в правильном порядке - сначала OracleXETNSListener, потом - OracleServiceXE).
Помогло следующее. Приконнектился с помощью:
sqlplus sys/111111 as sysdba
Выполнил:
alter system set local_listener = '(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' scope = both;
alter system register;
exit;
После чего:
lsnrctl stat 
Вуаля, можно коннектится.