WEB开发网
开发学院数据库Oracle Oracle中资源的共享与竞争及问题定位 阅读

Oracle中资源的共享与竞争及问题定位

 2007-05-13 12:29:55 来源:WEB开发网   
核心提示: dbms_application_info.set_client_info(string);是用来设置连接 ORACLE 的客户端信息的一个包 , 拿来 PRO*C 中运行:EXEC SQL EXECUTEBEGINdbms_application_info.set_client_info
dbms_application_info.set_client_info(string);

是用来设置连接 ORACLE 的客户端信息的一个包 , 拿来 PRO*C 中运行:

EXEC SQL EXECUTE
BEGIN
dbms_application_info.set_client_info(' 某应用程序 : 其 PID, 文件名 , 行号 ');
END:
END-EXEC;

运行该 PRO*C 程序 , 执行一条 SQL 语句 , 并在关闭光标之前故意让它:

sleep(1000);

以腾出足够多的时间来观察 v$session 中的 client_info 字段:

[bash$] sqlplus sys/change_on_install@orcl
SQL> select distinct * from (select a.client_info,b.sql_text,c.spid
> from v$session a,v$sql b , v$process c where a.client_info is not null
> and a.sql_hash_value=b.hash_value and a.paddr=c.addr);

正是你刚才设定的某应用程序:其PID,文件名,行号信息 , 别嫌短,这个 client_info 字段是 64 个字节够了。看能不能让这宝贵功能施于 PHP:

<?
$conn = OCILogon("username", "password", "dblink");
$stmt_client = OCIParse($conn, "call dbms_application_
info.set_client_info('PHP:$filename:$line')");
OCIExecute($stmt_client);
OCIFreeStatement($stmt_client);
$stmt = OCIParse($conn, "select ID from users where name='slimzhao'");
OCIDefineByName($stmt, ID, $name);
OCIExecute($stmt);
OCIFetch($stmt);
sleep(1000); // 故意的
OCIFreeStatement($stmt);
OCILogoff($conn);
?>

到 SQLPLUS 下一看 , 果不其然!将该功能加入前面的配置文件中,将会对 PHP 中的 SQL 语句进行更精确的跟踪定位。

至此,可以将数据库服务器下某一Oracle 的 shadow 进程与具体哪一个应用程序,甚至是哪一个源文件,哪一行的信息以及所执行的 SQL 语句等一一对应起来,有了这根主线,其它问题的分析就可步步深入,耗了多少时间,读了多少个数据块 , 进行了多少次排序,等等问题,都可通过 v$... 视图收集到足够的信息。本文重点不在于此,仅作抛砖,就此打住。

上一页  4 5 6 7 8 9 

Tags:Oracle 资源 共享

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接