如何使我的Java应用程序在连接时向Oracle标识自己?

当我的应用程序连接到Oracle数据库时,我希望能够通过查看数据库中与之连接的活动会话来查看。 目前它将自己标识为“JDBC瘦客户端”,因为这是我正在使用的驱动程序,但我拥有的其他基于Java的应用程序能够以某种方式将此值设置为更有意义的值,如“SQL Developer”。 我认为它是ConnectionOracleDataSource一个属性,但我没有设法找到一个可以解决问题的方法。 这可能吗? 如果它很重要,我使用Java 1.5,使用Oracle 10g和10g瘦驱动程序。

 java.util.Properties props = new java.util.Properties(); props.setProperty("password","mypassword"); props.setProperty("user","myusername"); props.put("v$session.osuser", System.getProperty("user.name").toString()); props.put("v$session.machine", InetAddress.getLocalHost().getCanonicalHostName()); props.put("v$session.program", "My Program Name"); DriverManager.registerDriver (new oracle.jdbc.OracleDriver()); Connection conn= DriverManager.getConnection("jdbc:oracle:thin:@myhostname:1521:mysid", props); 

 SQL>select username,osuser,program,machine from v$session where username = 'ROB'; USERNAME OSUSER PROGRAM MACHINE --------- ----------- ------------------ ----------- ROB rmerkw My Program Name machine 

在应用程序级别,您可以使用以下方法在v $ session中设置client_infomoduleaction

 dbms_application_info.set_client_info dbms_application_info.set_module dbms_application_info.set_action 

您需要在数据源中定义连接属性v$session.program ,以便将该属性添加到每个连接。 如何执行此操作取决于您的数据源实现。 您设置属性的值将显示在oracle的活动会话表中。

还有一个Oraclefunction:

 dbms_application_info.set_client_info('Client Info'); 

它在v $ session中设置ClientInfo列。

如果您只能访问Connection而不是基础DataSource或DriverManager,那么这可能很有用。

从oracle jdbc 12.1开始,您可以通过jdbc api设置一些客户端信息值,即可以

 connection.setClientInfo("OCSID.CLIENTID", "MyClientId"); 

对于属性OCSID …

ACTION,CLIENTID,ECID,MODULE,SEQUENCE_NUMBER和DBOP

请参阅https://docs.oracle.com/database/121/JJDBC/jdbcvers.htm#JJDBC29006

设置PROGRAM不会以这种方式工作,您可以按照接受的答案中的描述进行操作,或者通过设置系统属性“oracle.jdbc.v $ session.program”更容易。