【问题标题】:Oracle 11g - Share Sys_Context values across pool connection by user_idOracle 11g - 通过 user_id 跨池连接共享 Sys_Context 值
【发布时间】:2018-11-05 18:46:18
【问题描述】:

任何人都可以提供一个足够好的共享Sys_Context 使用示例

Dbms_Session.Set_Identifier(user_id)

我希望在用户成功登录后能够从不同的连接访问某些 sys 上下文属性。


我的场景

Spring Boot 2.0.6 使用 HikariCP 连接池连接到 Oralce 11g

程序

  1. 用户访问登录页面
  2. 登录 -> user_id 设置为 Dbms_Session.Set_Context('ENV', USER_ID, user_id)
  3. 用户访问某些资源(例如帐户)-> Sys_Context('ENV', user_id) 返回 Null

Sys_Context('ENV', user_id) 返回 Null,因为资源通过不同的连接访问 db,因此 CURRENT 上下文中没有 user_id。


此 Oracle 文档声称这是可能的:https://docs.oracle.com/cd/B28359_01/network.111/b28531/app_context.htm#DBSEG79745

如下所示: https://oracle-base.com/articles/misc/dbms_session https://web.stanford.edu/dept/itss/docs/oracle/10gR2/network.102/b14266/apdvcntx.htm

如果这不可能,请说明 Dbms_Session.Set_Identifier(user_id) 的确切用途,因为我发现这些文档非常晦涩,我无法复制它们显示的任何示例。

【问题讨论】:

    标签: database spring oracle plsql


    【解决方案1】:
    1. 必须使用GLOBALLY ACCESSIBLE 选项创建上下文,例如

      create context ENV using scott.security_pkg accessed globally;
      
    2. dbms_session.set_context 使用会话 ID(在 scott.security_pkg 内)调用,例如

      dbms_session.set_context(
        namespace => 'ENV',
        attribute => 'user_id',
        value     => 'jane',
        client_id => '12345');
      
    3. dbms_session.set_identifier 必须在每个会话中使用用户的会话 ID 调用,例如

      dbms_session.set_identifier(client_id=>'12345');
      
    4. 现在,您可以使用sys_context 获取属性的值,例如

      sys_context('ENV','user_id')
      

    这只是一个使用user_id 作为您希望存储的属性名称的示例。重要的一点是client_id,它唯一标识用户的会话。

    【讨论】:

    • 谢谢,关键是创建一个 GLOBALLY ACCESSIBLE 上下文并在每个 datasource.getConnection() 之前调用 dbms_session.set_identifier(AOP 或手动)。我已经使用 2 个 PLSQL Developer (IDEA) 连接进行了测试。上下文确实可以从不同的会话中访问并显示在select * from global_context
    猜你喜欢
    • 2010-12-19
    • 2013-11-05
    • 1970-01-01
    • 2015-03-12
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多