gpt4 book ai didi

asp.net - Oracle 存储过程基准测试

转载 作者:行者123 更新时间:2023-12-04 06:09:11 28 4
gpt4 key购买 nike

我是一名使用旧版 Oracle 数据库的 .Net Web 开发人员。过去我使用过 nHibernate 等 orm 工具,但这里的所有数据库通信都需要通过存储过程完成。我们的 dba 要求我们将一堆管理信息传递给我们调用的每个程序,包括最终用户的用户名/域/IP。然后,此数据用于调用另一个存储过程,该过程在每次调用过程时记录使用信息。

我不太精通 Oracle 或 Pl/Sql,我正试图以一种尽可能符合最佳实践的简洁方式编写我的 .Net 代码。在我看来,将额外数据传递给每个过程的过程在 .Net 和 Oracle 端都是困惑而乏味的。

有谁知道在没有所有开销的情况下实现 dba 目标的更好方法?或者这是我应该习惯的标准做事方式。

最佳答案

我会使用上下文而不是向每个存储过程调用传递额外的参数。上下文是存储存储过程都可以引用的任意 session 级状态数据的方便位置。

例如,我可以创建一个上下文 MYAPP_CTX为我的应用程序创建一个简单的包,让我可以在上下文中设置我想要的任何值。

SQL> create context myapp_ctx using ctx_pkg;

Context created.

SQL> create package ctx_pkg
2 as
3 procedure set_value( p_key in varchar2, p_value in varchar2 );
4 end;
5 /

Package created.

SQL> create package body ctx_pkg
2 as
3 procedure set_value( p_key in varchar2, p_value in varchar2 )
4 as
5 begin
6 dbms_session.set_context( 'MYAPP_CTX', p_key, p_value );
7 end;
8 end;
9 /

Package body created.

当应用程序从连接池中获得连接时,它会简单地设置所有上下文信息一次。
SQL> begin
2 ctx_pkg.set_value( 'USERNAME', 'JCAVE' );
3 ctx_pkg.set_value( 'IP_ADDRESS', '192.168.17.34' );
4 end;
5 /

PL/SQL procedure successfully completed.

然后,同一 session 中的后续调用和查询可以只询问存储在上下文中的任何值。
SQL> select sys_context( 'MYAPP_CTX', 'USERNAME' )
2 from dual;

SYS_CONTEXT('MYAPP_CTX','USERNAME')
--------------------------------------------------------------------------------
JCAVE

实际上,您几乎肯定想要添加 clear_context调用 dbms_session.clear_context( 'MYAPP_CTX' ) 的包的过程当连接返回到连接池时清除上下文中设置的任何值,以避免无意中允许来自一个 session 的上下文信息流入另一个 session 。您可能还会使用单独的程序来设计包,以设置和获取至少公共(public) key (用户名、IP 地址等),而不是在多个位置硬编码“用户名”。我使用了一个通用的 set_value方法只是为了简单。

关于asp.net - Oracle 存储过程基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984458/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com