会话控制¶
相关概念¶
会话,也称连接,它是神通数据库系统比较重要的资源之一,它的数量是有限的。当一个合法用户(通过验证的用户)连接上数据库的时候,系统都会从系统“会话池”中,为该连接分配一个空闲的“会话”。“会话”提供了用户使用数据库功能的各种资源和各种统计信息。一般来说,一个“会话”都会拥有一个线程资源(操作系统的线程),但是多个“会话”也可以共享同一个线程;一个线程可以对应一个“会话”,也可以对应多个“会话”,线程可以通过各种调度方法服务数据比自己多的“会话”。
会话状态监控¶
要管理会话必须得先获取当前所有会话的信息。用户可以通过视图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)