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$... 视图收集到足够的信息。本文重点不在于此,仅作抛砖,就此打住。
- ››oracle 中 UPDATE nowait 的使用方法
- ››Oracle ORA-12560解决方法
- ››Oracle 10g RAC 常用维护命令
- ››Oracle如何在ASM中定位文件的分布
- ››Oracle的DBMS_RANDOM.STRING 的用法
- ››oracle 外部表导入时间日期类型数据,多字段导入
- ››Oracle中查找重复记录
- ››oracle修改用户登录密码
- ››Oracle创建删除用户、角色、表空间、导入导出等命...
- ››Oracle中登陆时报ORA-28000: the account is lock...
- ››Oracle数据库在配置文件中更改最大连接数
- ››Oracle中在pl/sql developer修改表的两种方式
更多精彩
赞助商链接