如何从Oracle数据库查询访问应用的终端用户数量
Oracle 终端用户总数统计方案
你之前执行的两个查询统计的都是会话数,无法直接对应终端用户数,主要有两个偏差:
- 统计结果包含Oracle后台进程的内部会话,不属于终端用户产生的访问
- 同一个终端用户可能同时建立多个会话,直接计数会出现重复统计
基础查询(适用于终端直连数据库的场景)
如果是C/S架构、用户直接连接数据库的场景,可通过终端标识联合去重统计:
SELECT COUNT(DISTINCT osuser || '#' || machine || '#' || terminal) AS 终端用户总数 FROM v$session WHERE type = 'USER' -- 过滤Oracle后台进程会话 AND username IS NOT NULL -- 排除未完成登陆的无效会话 AND program NOT LIKE 'oracle%'; -- 额外过滤Oracle自带工具产生的非业务会话
字段说明:
osuser:终端设备的操作系统用户名machine:终端设备的主机名/IP地址terminal:终端的设备标识
三个字段联合去重,可避免同一个用户多开会话导致的重复计数。
三层架构场景查询(应用服务器连接池模式)
如果是应用通过连接池访问数据库的架构,所有会话的osuser、machine都会显示为应用服务器的信息,需要应用层在建立会话时主动设置CLIENT_IDENTIFIER标记实际终端用户,之后用以下语句统计:
SELECT COUNT(DISTINCT client_identifier) AS 终端用户总数 FROM v$session WHERE type = 'USER' AND client_identifier IS NOT NULL;
如果应用未设置CLIENT_IDENTIFIER,可根据实际业务逻辑,结合USERNAME、MODULE、ACTION等字段自定义去重规则即可。
内容的提问来源于stack exchange,提问作者litha
相关产品推荐
相关产品推荐

