最近线上不断爆出数据库连接超时,表现
1.应用无法连接数据库
2.日志中c3p0不断报出time out
排查:
检查数据库中是否有过多sql语句,没有发现问题。
select sq.SQL_TEXT from v$open_cursor oc, v$sql sq, v$session s
where oc.HASH_VALUE = sq.HASH_VALUE and s.SID = oc.SID and s.STATUS = 'ACTIVE' and s.USERNAME='VIDS' order by sq.SQL_TEXT;
最初怀疑c3p0配置问题,发现网上曾有c3p0同样的错误,加大连接数据至500,导致sqlplus都无法连接数据库。
最后通过语句,发现很多没有提及释放连接的sql语句
SELECT osuser, a.username,cpu_time/executions/1000000||'s', b.sql_text,machine from v$session a, v$sqlarea b
where a.sql_address =b.address order by cpu_time/executions desc;
总结:
V$SQL:Child cursor details for V$SQLAREA
V$SQLAREA:Shared pool details for statements/anonymous blocks
V$SQLTEXT:SQL text of statements in the shared pool
v$sql的每一行表示的是每一个sql语句的一个版本,而v$sqlarea存放的是相同语句不同版本一个group by汇总。
v$sql与v$sqlarea的源都是X$KGLCURSOR
v$sql及v$sqlarea存放着统计信息在调优时使用居多,但其sql是不全的,如果想获得完整的sql需使用v$sqltext。
通过以上信息可以得知,在使用工具排查问题时候,必须对工具区别对待。