【发布时间】:2014-11-13 10:50:29
【问题描述】:
我想为 Oracle 编写 kill_inactive 会话存储过程。
像
create or replace procedure kill_inactive_sessions as
begin
for rec in (select sid, serial# from sys.v_$session where status = 'INACTIVE')
loop
execute immediate 'alter system kill session '''|| rec.sid || ',' || rec.serial# || ''' IMMEDIATE';
end loop;
end kill_inactive_sessions;
上一个不起作用(表或视图不存在)。
但是下一个选择对同一个用户来说是完美的:
select sid, serial# from sys.v_$session where status = 'INACTIVE';
我错过了什么?
【问题讨论】:
-
首先,定义“不起作用”。它会抛出错误吗?什么错误?它不会做你期望它做的事情吗?其次,你到底为什么要这样做?您是否意识到大多数会话在绝大多数时间都处于非活动状态?您将杀死在那个特定时刻没有运行 SQL 语句的每个会话。这将导致大量用户出现错误并立即重新登录。
-
我受限于用户连接数。我很确定,在我的应用程序非正常关闭后,大多数会话都不会被使用(在运行单元测试之后,应用程序就被杀死了)。所以我正在尝试释放不再使用的会话。
-
您如何“受限于用户连接数”?您是指某种数据库限制吗?我假设您的应用程序是一个三层应用程序,因此“非正常关闭”意味着应用程序服务器崩溃。一般来说,我会在数据库中启用死连接检测,以便数据库可以更有效地清理客户端终止的连接。但是,在特定情况下,您肯定只想终止特定用户的会话,而不是所有非活动用户。
标签: oracle stored-procedures plsql