Welcome 微信登录

首页 / 数据库 / MySQL / Oracle Application Context

Application Context是内存中的一组name-value对,application context从属于某个命名空间(namespace)。用户只能通过一个自定义procedure调用dbms_session.set_context来设置application context的值。用户使用sys_context(<namespace>,<name>)来获取某个application context的值。Application context分为三种 
  • dabase session-based application context,又称为local application context。
  • global application context
  • client session-based application context。通常被OCI使用,存储在客户端内存,而不是Oracle服务器端,也由OCI程序管理。
Local application context存储在UGA中,dedicated server mode, UGA在PGA中,shared server mode,UGA在SGA中。local application context是会话/server process级别的。只有本会话能够访问。当会话/server process终止时,local application context的生命周期也结束了。另一篇博客Oracle VPD http://blog.csdn.net/chncaesar/article/details/18550029 给出了一个local application context的例子。  Global application context存储在SGA中,只要SGA不消亡,global application context就一直存在。global application context常常用于跨会话,与会话无关的场景。dbms_session.set_context有两个默认值为NULL的参数: 
  • username
  • client_id
 username = null , client_id=null。所有用户都能访问。username = null, client_id=<client_id>。 只要session 的client_id =<client_id>,而不管username,都能访问。username = <database username>, client_id=null。只要session使用指定的oracle schema登陆,不管client_id,都能访问。username = <database username>, client_id=<client_id>. 常用于statless web session ,如http。username = <non-database username>, client_id=<client_id> . 该username将用于数据库连接池的owner。例子1: 所有用户都能访问的application contextCREATE OR REPLACE CONTEXT global_hr_ctx USING hr_ctx_pkg ACCESSED GLOBALLY;
CREATE OR REPLACE PACKAGE hr_ctx_pkg
 AS 
    PROCEDURE set_hr_ctx(sec_level IN VARCHAR2);
    PROCEDURE clear_hr_context;
 END; 
  /
  CREATE OR REPLACE PACKAGE BODY hr_ctx_pkg
 AS                                           
    PROCEDURE set_hr_ctx(sec_level IN VARCHAR2)     
    AS 
    BEGIN 
   DBMS_SESSION.SET_CONTEXT( 
   <strong> namespace  => "global_hr_ctx",
      attribute  => "job_role",
      value      => sec_level);</strong>
   END set_hr_ctx;
         
  PROCEDURE clear_hr_context 
    AS
    BEGIN 
   DBMS_SESSION.CLEAR_CONTEXT("global_hr_ctx", "job_role");
    END clear_context; 
  END;
 /例子2: 跨session/application,但是使用同一个数据库schema的application context。CREATE OR REPLACE PACKAGE hr_ctx_pkg
  AS
    PROCEDURE set_hr_ctx(sec_level IN VARCHAR2, user_name IN VARCHAR2);
    PROCEDURE clear_hr_context;
 END;
  /
  CREATE OR REPLACE PACKAGE BODY hr_ctx_pkg
 AS
    PROCEDURE set_hr_ctx(sec_level IN VARCHAR2, user_name IN VARCHAR2)
    AS
   BEGIN
      DBMS_SESSION.SET_CONTEXT(
     namespace  => "global_hr_ctx",
     attribute  => "job_role",
     value      => sec_level,
<strong>     username => user_name);</strong>
      END set_hr_ctx;
 
 PROCEDURE clear_hr_context
    AS
   BEGIN
      DBMS_SESSION.CLEAR_CONTEXT("global_hr_ctx");
   END clear_context;
  END;
 /两个例子都提供了clear_hr_context 存储过程。这是因为global application context常驻SGA,需要用户使用完毕就清理,以免信息泄露。 USERENVUSERENV是Oracle预定义的命名空间。它包含了许多常用的application context。 
  • CURRENT_USER
  • DB_NAME
  • HOST: 客户端机器名
  • CLIENT_INFO: 客户端程序用作计数,标识符等
其他application context请参考SQL Language Reference。VMware+Linux+Oracle 10G RAC全程详细图解 http://www.linuxidc.com/Linux/2011-02/31976.htm在CentOS 6.4下安装Oracle 11gR2(x64) http://www.linuxidc.com/Linux/2014-02/97374.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579p2.htmDebian 下 安装 Oracle 11g XE R2 http://www.linuxidc.com/Linux/2014-03/98881.htmOracle 11gR2 在VMWare虚拟机中安装步骤 http://www.linuxidc.com/Linux/2013-09/89579.htm更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址