Global Context work in RAC 11.2 !!!

Помимо массы архитектурных изменений, RAC в версии 11g Release 2 принес еще одну хорошую новость: теперь в RAC работают глобальные контексты (Global Application Context)
Вообще, глобальные контексты, как таковые, работали в RAC и до версии 11.2, но с одним "нехорошим" поведением: значения параметров не синхронизировались между узлами кластера. То есть: если значение параметра в контекст записала сессия на одном узле, а другая сессия пытается прочитать его на другом - значение параметра будет пустым!

Те, кто был на нашем семинаре RAC DD4D, хорошо это знают - я демонстрировал пример этой неприятной особенности контекстов в RAC.
Но теперь это в прошлом: начиная с 11.2 глобальные контексты полностью поддерживаются в RAC!

Как насчет pipe-ов в RAC?
Нет, нет: к сожалению, pipe-ы до сих пор в РАКе не работают.
- Но у нас есть обходное решение ! :-)
На семинаре оно тоже демонстрировалось.


node1-> sqlplus rscott/rtiger@orcl1

SQL*Plus: Release 11.2.0.1.0 Production on Tue Nov 16 18:23:45 2010

Copyright (c) 1982, 2009, Oracle. All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
1

SQL> create context my_context using set_rac_context
accessed globally;

Context created.

SQL> create or replace procedure set_rac_context(v_pName in varchar2,
v_pValue in varchar2) is
begin
dbms_session.set_context('MY_CONTEXT',v_pName, v_pValue);
end;
/
show errors;

Procedure created.

No errors.

SQL> exec set_rac_context('Hello','World');

PL/SQL procedure successfully completed.

SQL> select sys_context('MY_CONTEXT','Hello') from dual;



SYS_CONTEXT('MY_CONTEXT','HELLO')
--------------------------------------------------------------------------------
World

SQL> conn rscott/rtiger@orcl2
Connected.
SQL> select dbms_utility.current_instance from dual;

CURRENT_INSTANCE
----------------
2

SQL> select sys_context('MY_CONTEXT','Hello') from dual;

SYS_CONTEXT('MY_CONTEXT','HELLO')
--------------------------------------------------------------------------------
World

SQL> --!!!

1 комментарий:

  1. Дима, раз пошла тема по контекстам - есть один "нехороший" момент. В базе существует возможность указывать пользователей (как, собственно и имена других объектов) с использованием маленьких букв, да и сторонних алфовитов. Соответственно - такие пользователи задаются как '"Вася"'. И всё бы хорошо,только функция установки контекста преобразует такую строчку по принципу SUBSTR(UPPER(NAME),1,30), Т.е. имя в 30 символов с прописными превратится в двойные кавычки и первые 29 букв, приведённых к верхнему регистру. Ну а если меньше - то же имя в верхнем регистре, но с оставшимися двойными кавычками. Понятно, что SYS_CONTEXT для дакого пользователя ничего не вернёт...
    BUG: 10008469, статус 11 (насколько я понимаю - в разработке)

    ОтветитьУдалить