这时候需要找出造成异常阻塞的session并清除。
oracle
session通常具有三个特征:
(1)一个session可能阻塞多个session;
(2)一个session最多被一个session阻塞;
(3)session阻塞关系不会形成环路。(环路即死锁,oracle能自动解除)
因此session的阻塞关系为一棵树,进而DB系统所有session的BLOCK阻塞关系是一个由若干session阻塞关系树构成的森林,而异常session一定会在故障爆发时成为根(root)。因此,找寻异常锁表session的过程就是找出异常的root。
一般认为异常root有两个特征:(1)block树的规模过大,阻塞树规模即被root层层阻塞的session总数;(2)阻塞的平均等待时间过长。
查找异常session的方法一:
OEM—>
performance—>
Blocking
Sessions
查找异常session的方法二:
select
r.root_sid,
s.serial#,
r.blocked_num,
r.avg_wait_seconds,
s.username,s.status,s.event,s.MACHINE,
s.PROGRAM,s.sql_id,s.prev_sql_id
from
(select
root_sid,
avg(seconds_in_wait)
as
avg_wait_seconds,
count(*)
-
1
as
blocked_num
from
(select
CONNECT_BY_ROOT
sid
as
root_sid,
seconds_in_wait
from
v$session
start
with
blocking_session
is
null
connect
by
prior
sid
=
blocking_session)
group
by
root_sid
having
count(*)
>
1)
r,
v$session
s
where
r.root_sid
=
s.sid
order
by
r.blocked_num
desc,
r.avg_wait_seconds
desc
该SQL语句即是根据v$session的字段blocking_session统计阻塞树根阻塞session的计数以及平均阻塞时间、并进行排序,排名最前的往往是异常session。
用sendUrgentData这个来判断服务端是否异常关闭
想实现自动连接服务端,如果用
socket = new Socket("192.168.1.4",1821)
socket.connect()
只有每次去new创建这个sock对象,因为只有sock对象创建好了才由输入输出流
目前的实现方式就是,
1.在原有的基础上,再开多一个线程,专门负责发送心跳,
2.先睡眠500毫秒,
3.用socket.sendUrgentData(FF),给服务端,
4.如果服务端异常关闭的话,我就捕捉这个异常。。。
5.循环
心跳的意思就是每隔一段时间,客户端给服务器发一段消息:
1、客户端:服务器,我还活着,你死了没
2、服务器:客户端,我知道你还活着这个信息,我已经记录下来了,同时告诉你我也还活着
更多问题到问题求助专区http://bbs.houdunwang.com/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)