会话控制

相关概念

会话,也称连接,它是神通数据库系统比较重要的资源之一,它的数量是有限的。当一个合法用户(通过验证的用户)连接上数据库的时候,系统都会从系统“会话池”中,为该连接分配一个空闲的“会话”。“会话”提供了用户使用数据库功能的各种资源和各种统计信息。一般来说,一个“会话”都会拥有一个线程资源(操作系统的线程),但是多个“会话”也可以共享同一个线程;一个线程可以对应一个“会话”,也可以对应多个“会话”,线程可以通过各种调度方法服务数据比自己多的“会话”。

会话状态监控

要管理会话必须得先获取当前所有会话的信息。用户可以通过视图V_SYS_SESSIONS获取当前活动会话的信息,包括会话号,当前用户,登录时间,当前执行的SQL等信息。V_SYS_SESSIONS各列的具体含义如下表:

表6-1 V_SYS_SESSIONS表的内容

列名 类型 含义
SESSION ID SMALLINT 当前会话的唯一标识
LOGON USER TEXT 该会话的登录用户名
CURRENT USER TEXT 该会话的当前用户
LOGONTIME TEXT 用户登录时间,精确到秒
APPNAME TEXT 客户端应用程序名称
DBNAME TEXT 会话连接的数据库名
PId INT 当前连接的线程ID号
CONNECT MODE BOOL 当前的连接模式(共享/非共享)
DEFALT SCHAMA TEXT 当前模式默认模式名
USER ADDRESS TEXT 用户的物理地址
MACHIEN GROUP TEXT 用户操作系统所属的组
CURRENT SQL TEXT 该会话当前正在执行的SQL语句
LAST SQL TEXT 该会话刚刚执行完成的SQL语句
SQL COUNT INT 该会话执行的SQL语句总数
TOTAL CURSORS INT 该会话当前打开的游标与prepare之和
CURRENT XID SMALLINT 该会话当前正在做的事务号
X COMMIT INT 该会话已经提交的事务数量
X ROLLBACK INT 该会话已经回滚得事务数量
TOTAL LOCK LARGEINT 该会话加锁总数
CURRENT LOCK INT 当前事务的加锁数据
CURRENT PHY LOCK INT 当前事务正持有的锁数目
TOTAL BYTES SEND LARGEINT 发送的字节数
TOTAL BYTES RECV LARGEINT 接收到的字节数
TOTAL PACKET SEND LARGEINT 发送的数据报数
TOTAL PACKET RECV LARGEIN 接收到的数据报数
TOTAL MEMORYCONTEXT MEMORYCONTEXT MEMORYCONTEXT INT MEMORYCONTEXT占用的内存空间
TOTAL CHUNKMEM INT CHUNKMEM占用的内存空间
TOTAL ELOGMEM INT ELOGMEM占用的内存空间
TOTAL PRIMEMORYCONTEXT INT GEINT PRIMEMORYCONTEXT占用的内存空间空间

下面给出一个查询当前会话内容的简单例子:

--  查询当前会话信息
SELECT "SESSION ID" ,"CURRENT USER", "DBNAME" FROM V_SYS_SESSIONS;

--  查询结果 (当前有两个会话——分别以 SYSDBA 、 SYSAUDIT登录)
 SESSION ID | CURRENT USER | DBNAME
------------+--------------+--------
          0 | SYSDBA       | OSRDB
          1 | SYSAUDIT     | OSRDB
(2 rows)

终止会话

在某些情况下,可能希望终止当前的用户会话。 例如,如果想执行一些管理操作,而这些管理操作需要终止所有的非管理会话。 用户可以使用 KILL SESSION 语句来终止会话。 系统根据不同的选项,决定终止当前事务,或者等当前事务完成后中止会话。

示例

--  查看当前会话信息
SELECT "SESSION ID", "CURRENT USER", "DBNAME" FROM V_SYS_SESSIONS;

--  查询结果 (当前有两个会话——分别以 SYSDBA 、 SYSAUDIT登录)
 SESSION ID | CURRENT USER | DBNAME
------------+--------------+--------
          0 | SYSDBA       | OSRDB
          1 | SYSAUDIT     | OSRDB
(2 rows)

--  终止会话,回滚当前事务
KILL SESSION 1 IMMEDIATE;

--  再次查看当前会话信息
SELECT "SESSION ID" ,"CURRENT USER", "DBNAME" FROM V_SYS_SESSIONS;

--  查询结果 (原会话1已被KILL,只剩下会话0)
 SESSION ID | CURRENT USER | DBNAME
------------+--------------+--------
          0 | SYSDBA       | OSRDB
(1 row)