2009-10-23 61 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客戶端柱。