2009-10-23 62 views
13

连接到Oracle时,JDBC驱动程序将自身标识为Oracle的“JDBC瘦客户端”(在v $ session中作为“程序”)。 v $ session中还有一个'ClientInfo'列可用于此目的,但它总是空的。我们需要识别连接到Oracle的不同应用程序(它们运行在同一个主机上,所以v $ session中的'machine'列都是一样的),所以有可能改变Oracle JDBC瘦客户端驱动程序标识自己(例如,我们可以把应用程序名称),?更改Oracle JDBC瘦客户端标识符

还是有推荐的方法来做到这一点?一个限制是我们在Struts中为一些应用程序执行此操作,这是在内部处理连接设置。

+1

可能的重复[如何让我的Java应用程序向Oracle标识自己连接?](http://stackoverflow.com/questions/1548400/how-do-i-make-my-java-application-identify -oracle-on-connection) – derobert 2012-06-15 15:14:02

回答

18

[Identical to this answer]

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 

在应用层面,你可以使用下面的方法来设置CLIENT_INFO模块行动V $ SESSION

dbms_application_info.set_client_info 
dbms_application_info.set_module 
dbms_application_info.set_action 
+0

干杯,这应该有助于一些应用程序 - 这是否与OracleConnectionPoolDataSource一起工作?我看到那里有一个setConnectionProperties方法。我是否必须指定列出的所有字段,即使我在OracleConnectionPoolDataSource上使用.setUser(),.setPassword()等方法? – JeeBee 2009-10-23 11:08:19

+1

我知道它适用于OracleConnectionPoolDataSource。很久以前,所以我不记得具体细节。 setConnectionProperties将java.util.Properties作为参数。不要以为这会清空使用.setUser(),.setPassword()设置的用户和密码。我有道理吗? ;-) – 2009-10-23 12:21:33

+0

嗨!是的,这是有道理的,它只适用于v $ session.program集合。干杯。 – JeeBee 2009-11-09 13:35:17

2

还有一个Oracle功能:

dbms_application_info.set_client_info('Client Info'); 

它设置在V $ SESSION的ClientInfo客户端柱。