正在帮同事解决问题,客户反映生产环境出现了
No ManagedConnections available within configured blocking timeout ( 5000 [ms] )
由于应用已经上线很长时间里,一直很正常。最近也没有升级。
排除程序的问题,第一反应就是应用上有比较耗时的SQL。
简单的检查了ORACLE的alert.log ,和数据库主机的资源使用情况。没发现什么异常。
应用抛出的错误信息如下:
找到错误日志
找到第一次报错的时间点,大约在 2010-12-13 16:00:01
登录数据库启动dbconsole
emctl start dbconsole
集群数据库: *** > 数据库实例: **** > 等待的活动会话数: User I/O
根据日志中开始报错的时间点,查看相应时间点数据库的负载情况。
找到活动百分比靠前的SQL,分析SQL的执行计划。
找到的sql如下
SELECT *
FROM (Select RowNum As LineNum, T.*
From (Select *
From pt_table
Where 1 = 1
and Risk= '0507'
AND (((((pt_table.Com IN ('38001105'))) OR
(((pt_table.Handler1 = '3800110501')) OR
((pt_table.Handler = '3800110501')) OR
((pt_table.Operator = '3800110501'))))))
Order By ProposalNo DESC) T
Where RowNum <= 10)
Where LineNum > 0
Order By ProposalNo DESC
计划对上述sql做如下调整:
1.业务中修改一些查询条件,限制某些条件为必填项。
2.限制查询的时间段
3.在分页的RowNum <= 10改为绑定变量形式。