Oracle会话达到一定连接时间自动断开方法
1. Oracle数据库中都有至少一个Proflie文件,它是口令限制,资源限制的命名集合。建立oracle数据库时,oracle会自动建立名为DEFAULTPROFILE,初始化的DEFAULT没有进行任何口令和资源限制,用户yherp使用的就是DEFAULTPROFILE。可以执行语句查看:
select username,profile from dba_users where username = 'YHERP';
查看这个PROFILE的内容:
select * from dba_profiles where profile='DEFAULT';
红标记的“IDLE_TIME”意为空闲时间,默认值为“UNLIMITED”,后面会进行设置。
2. Oracle的系统参数RESOURCE_LIMIT是一个用于控制用户对于数据库资源使用的参数,当值为true的时候即为启用,否则禁用(默认是禁用的)。该参数结合profile来可以控制多种资源的使用,如CPU_PER_SESSION, CONNECT_TIME,LOGICAL_READS_PER_SESSION,PRIVATE_SGA等等,从而达到到节省资源来实现高效性能。通过以下语句查看其状态:
SELECT name, value FROM gv$parameter WHERE name = 'resource_limit';
3. 首先:开启这个参数:
ALTER SYSTEM SET RESOURCE_LIMIT=TRUE;
查看开启结果:SELECT name, value FROM gv$parameter WHERE name = 'resource_limit';
其次:修改已存在的Profile中的IDLE_TIME:(单位为分钟,设置为一天24小时)
ALTER  PROFILE  DEFAULT  LIMIT  IDLE_TIME  1440;
说明:a.参数RESOURCE_LIMIT = TRUE用于启用数据库资源配置限制;
b.profile用于实现资源配置,创建profile或修改已存在的profile来调整各个具体资源配置;
c.一旦被限制的用户超出所设定的阀值将收到资源配置相关的错误提示;
d.被限制资源的session状态变成sniped
e.被限制资源的session对应的server process并没有被释放,需要结合pire_time来进行释放
4. 使用SQLNET.EXPIRE_TIME清除僵死连接:
数据库连接的客户端异常断开后,其占有的资源并没有被释放,从v$session视图中依旧可
以看到对应的session处于inactive状态,且对应的服务器进程也没有释放,导致资源长时间地被占用。SQLNET.EXPIRE_TIME专门用于清理那些异常断开的情形:通过设定参数为非零值(单位为分钟)来发送探测包以检查客户端的异常断开。一旦探测包到了异常的连接将返回错误,清除对应的server process
配置SQLNET.EXPIRE_TIME
对于SQLNET.EXPIRE_TIME的配置,需要修改a,其路径为$ORACLE_HOME/network/admin下。然后添加SQLNET.EXPIRE_TIME
在末尾添加SQLNET.EXPIRE_TIME = 1470
之后重启数据库。
5. 总结:
a. INACTIVE session是用户建立连接之后,尚未执行任何操作或操作已经完成但没有断开,等同于与处于idle状态,在v$session视图呈现的是INACTIVE状态;
b. 对于使用resource_limitprofile配置后用户session超出idle_time的情形,在v$session视图呈现sniped状态;
c. 当在a配置文件中设置了SQLNET.EXPIRE_TIME参数为非零值时,僵死连接在EXPIRE_TIME指定的时间后被清除(设定24小时后将INACTIVE状态的SESSION置为SNIPED状态,之后再半小时后清除僵死连接,理论上是行得通的)
d. 设定SQLNET.EXPIRE_TIME为非零值之后,系统需要产生额外的开销以及带来网络性能的下降;
e. 对于需要及时释放OSDB资源的情形,Oracle建议使用resource_limit oracle建立数据库连接 profile 限制用户连接的同时并设定SQLNET.EXPIRE_TIME为非零值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。