
oracle jdbc 驱动对 `setclientinfo()` 方法的命名空间有严格限制,仅支持预定义的 `ocsid` 等少数命名空间(如 clientid、module、action),直接使用任意键(如 `"user.userid"`)会触发 ora-28267 错误。
在 Oracle 12c 及更高版本中,JDBC 驱动遵循 Oracle Call Stack Identifier(OCSID)标准,仅允许通过 setClientInfo(String name, String value) 设置特定命名空间下的属性,且命名空间必须为 "OCSID" —— 其他自定义前缀(如 "USER"、"APP" 或 "CUSTOM")均不被识别,将导致 ORA-28267: Invalid Namespace Value 异常。
✅ 正确可用的 OCSID 属性包括:
- "OCSID.CLIENTID":标识客户端用户或会话逻辑身份(如 "Alice_HR_Payroll")
- "OCSID.MODULE":标识应用模块名(如 "APP_HR_PAYROLL")
- "OCSID.ACTION":标识当前执行的操作(如 "PAYROLL_REPORT")
- "OCSID.CLIENT_INFO":最多 64 字节的通用字符串(兼容旧版 DBMS_APPLICATION_INFO.SET_CLIENT_INFO)
⚠️ 注意事项:
- 所有键名必须全大写且严格匹配上述格式(大小写敏感);
- 值长度受 Oracle 内部限制(如 CLIENTID 最长 64 字节,MODULE/ACTION 各 48 字节);
- 设置后可通过 V$SESSION 视图查询:
SELECT client_identifier, module, action, client_info FROM v$session WHERE sid = SYS_CONTEXT('USERENV', 'SID'); - 不支持嵌套命名空间(如 "USER.USERID")、点号分隔的自定义前缀,或未在 OCSID 规范中定义的键。
? 示例代码(Java 8 + Oracle JDBC 12.2+):
// ✅ 正确:使用标准 OCSID 命名空间
connection.setClientInfo("OCSID.CLIENTID", "john_doe@hr-app");
connection.setClientInfo("OCSID.MODULE", "HR-Payroll-Service");
connection.setClientInfo("OCSID.ACTION", "generate_monthly_report");
connection.setClientInfo("OCSID.CLIENT_INFO", "tenant=us-east;env=prod");
// ❌ 错误:自定义命名空间将抛出 ORA-28267
// connection.setClientInfo("USER.USERID", "john_doe"); // 不支持
// connection.setClientInfo("APP.VERSION", "2.1.0"); // 不支持? 补充建议:若需传递更丰富的上下文信息(如用户 ID、租户、请求 ID),推荐组合使用 OCSID.CLIENTID(主标识)与 OCSID.CLIENT_INFO(结构化补充),并确保值经 URL 编码或 Base64 处理以规避特殊字符截断风险。同时,务必在连接池(如 HikariCP、Tomcat JDBC Pool)配置中启用 connectionInitSql 或 dataSourceProperties 显式初始化 client info,避免连接复用导致信息污染。










