代码之家  ›  专栏  ›  技术社区  ›  Ira Baxter

在Oracle内存缓存中长期存储PLSQL存储过程值

  •  0
  • Ira Baxter  · 技术社区  · 16 年前

    我正在从PLSQL存储过程收集运行时评测数据。数据是在某些存储过程执行时收集的,但它需要在这些过程的多个执行中累积。

    为了尽可能减少开销,我想在数据收集间隔期间将分析数据存储在某个PLSQL可访问的Oracle内存驻留存储中,然后转储累积的值。数据收集间隔可能是秒或小时;不跨系统引导存储这些数据是可以的。类似于web服务器中的会话状态就可以了。

    我存储这些数据的选择是什么?

    procedure set_ctx (value in varchar8) as 
    begin
        dbms_session.set_context ( 'Test_Ctx', 'AccumulatedValue', value, NULL, 'ProfilerSessionId' );
    end set_ctx;
    

    我所希望的是一种使用普通的PLSQL语句在一些Oracle内存中访问/存储值数组的方法,访问时间是对包本地数组进行数组访问的典型时间。

    编辑(了解PLSQL包变量的会话生存期之后):

    是否存在生命周期长于“会话”的PLSQL可访问变量?我猜这样的变量可能需要同步才能从多个会话中安全更新。奇怪的是,我收集的这种性能数据不会因为这种同步错误而受到严重影响,因为performacne数据值只是单调增长的。同步错误仅仅意味着我们没有捕捉到一点价值增长,我不认为这会损害我正在做的事情。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Tony Andrews    16 年前

    我能想到的唯一方法就是拥有一个“侦听器”进程,它不断地运行和维护内存中的数据。然后,你的其他进程将通过与监听器通信来记录信息,例如。 DBMS_PIPE 或 DBMS_AQ

    但是,我怀疑对于调用程序来说,这是否比通过自治事务将信息写入表的简单解决方案更有效。

        2
  •  0
  •   JulesLt    16 年前

    如果您可以执行插入而不是更新,那么锁定的风险应该非常低,然后您可以对行使用视图或物化视图来获取累计总计。

    或者,如果将其与Tony建议的DBMS\u AQ方法结合使用,则可以保证不会发生锁—将消息放入队列的速度很快,并且可以将队列链接到在Oracle后台线程上执行的PLSQL包上的回调。

        3
  •  0
  •   pj.    16 年前

    https://sourceforge.net/p/plj-logger/home/ http://www.pljumpstart.com/download

    它的另一个优点是实现起来非常简单。一个单一的包装和支持表等。