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

时间:2009-10-10 16:32:50

标签: java oracle properties connection

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

5 个答案:

答案 0 :(得分:15)

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_info 模块操作 >:

dbms_application_info.set_client_info
dbms_application_info.set_module
dbms_application_info.set_action

答案 1 :(得分:2)

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

答案 2 :(得分:2)

还有一个Oracle功能:

dbms_application_info.set_client_info('Client Info');

在v $ session中设置ClientInfo列。

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

答案 3 :(得分:1)

从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不会以这种方式工作,您可以按照接受的答案中的描述进行操作,或者通过设置系统属性&#34; oracle.jdbc.v $ session.program&#34;。< / p>

答案 4 :(得分:0)

从12.1开始,setEndToEndMetrics已过时,您可以使用setClientInfo 请参阅12.2 here

的文档

这是用法的摘录

// "conn" is an instance of java.sql.Connection:
conn.setClientInfo("OCSID.CLIENTID", "clientID");
conn.setClientInfo("OCSID.MODULE", "myModule");
conn.setClientInfo("OCSID.ACTION", "myAction");

此查询相关会话可能会在V$SESSION中显示设置

 select MODULE, ACTION, CLIENT_IDENTIFIER from v$session where ...

,但仅在使用此连接执行下一条语句之后setClientInfo的调用不会触发额外的往返,该信息将在下次调用时传递。

还请注意,您必须使用Oracle(未包装)连接-选中this作为参考。