awr报告中sql的module列为“jdbc thin client”是jdbc thin驱动初始化连接时硬编码通报的默认值,需在执行sql前调用connection.setclientinfo("module", "...")(oracle 11.2+有效)或通过connection-init-sql调用dbms_application_info.set_module方可覆盖;该变更仅影响后续sql,且受限于ash采样频率与保留窗口。

AWR报告里SQL的MODULE列显示为jdbc thin client,不是配置错误,也不是驱动缺陷,而是JDBC Thin驱动在建立连接时默认向数据库通报自身身份的行为结果。
为什么Thin驱动会填这个值
JDBC Thin驱动在初始化连接时,会通过OCI协议的OCISessionBegin调用向Oracle服务端传递客户端元信息,其中module字段由驱动内部硬编码设定为"jdbc thin client"(Oracle官方驱动源码可验证)。这个值不随应用代码里的setClientInfo("Module", "...")覆盖——除非显式调用setClientInfo()且数据库版本 ≥ 11.2,否则AWR捕获到的就是默认字符串。
- 该行为与OCI驱动不同:OCI驱动通常继承操作系统进程名或由
ORACLE_HOME/ORACLE_SID环境变量推导出模块名 - 从Oracle 10g起,
V$SESSION和DBA_HIST_ACTIVE_SESS_HISTORY中的MODULE字段即来源于此通报,AWR报告直接聚合这些历史快照数据 - 即使应用层使用Spring Boot + HikariCP,只要底层用的是标准
ojdbc8.jar或更高版本,且未主动设置模块名,就一定会看到这个值
如何让模块名变成你想要的业务标识
必须在获取连接后、执行SQL前,调用JDBC标准接口Connection.setClientInfo(),且需确保数据库兼容性:
- Oracle 11.2及以上版本支持该方法写入
V$SESSION.MODULE;低于11.2的版本调用无效,仍显示jdbc thin client - 示例代码:
connection.setClientInfo("ApplicationName", "order-service"); connection.setClientInfo("Module", "payment-process"); connection.setClientInfo("Action", "submit-payment"); - 若用连接池(如HikariCP),需配置
connection-init-sql执行DBMS_APPLICATION_INFO.SET_MODULE,例如:CALL DBMS_APPLICATION_INFO.SET_MODULE('inventory-api', 'stock-check')
为什么改了还是没出现在AWR里
常见原因不是代码没写,而是时间窗口或采样精度问题:
- AWR默认每小时采样一次
V$SESSION,而setClientInfo()只影响当前会话的内存状态;如果SQL执行很快(毫秒级),可能根本没被ASH采样到,自然也不会进WRH$_ACTIVE_SESSION_HISTORY表 -
DBA_HIST_ACTIVE_SESS_HISTORY中MODULE字段只保留最近1小时的活跃会话快照(默认),旧快照已归档,新报告查不到 - 确认是否真的生效:在SQL*Plus中执行
SELECT MODULE FROM V$SESSION WHERE SID = SYS_CONTEXT('USERENV','SID');,返回值应是你设的值,而非jdbc thin client
最易被忽略的一点:模块名变更只对后续执行的SQL生效,已提交的SQL语句在AWR中永远保留它最初执行时的MODULE值。哪怕你在事务中途调用setClientInfo(),之前那几条SQL在AWR里还是jdbc thin client。











