问题
I have an Oracle connection (in a java.sql.Connection object) that is mounted from a properties file (ApplicationResources.properties).
How do I capture information about host, port, sid, user and password? (I need this information to call a specific database function through my java application)
Below my code:
private void conectaBanco() {
ServiceLocator sl = new ServiceLocator();
InitialContext ic = null;
DataSource dataSource = null;
try {
if (conn == null) {
ic = new InitialContext();
dataSource = (DataSource) ic.lookup(sl.getInfo().getString("JNDI"));
conn = dataSource.getConnection();
conn.setAutoCommit( true );
// I need host, port, sid and password information
System.out.println("USER " + conn.getMetaData().getUserName());
}
} catch (SQLException e) {
logger.error("Erro ao tentar abrir conexao com o banco de dados.", e);
} catch (NamingException e) {
logger.error("Erro ao tentar abrir conexao com o banco de dados.", e);
}
if(conn != null)
rastrear.definePredicate(conn);
}
回答1:
SESSION SID:
SELECT sys_context('USERENV', 'SID') FROM DUAL;
ORACLE_SID:
SELECT sys_context('userenv','instance_name') FROM dual;
HOST (Database machine) :
SELECT UTL_INADDR.get_host_name FROM dual;
Password: See http://www.dba-oracle.com/t_password_storage.htm
CLIENT SIDE Port:
Select port from v$session;
SERVER OS PID of Oracle server process connected to client process
SELECT p.spid
FROM v$process p, v$session s
WHERE s.paddr = p.addr and
sys_context('USERENV', 'SID') = s.sid;
Server side port:
This is really difficult since the server process port is mapped to a different port then the initial - for example port 12102 in listener.ora/tnsnames.ora get mapped by listener to a arbitrary free one (by the way: thats the reason why often firewalls need to be shutdown and while connections cannot get after mapping through firewall. This can be fixed but this is another story)
Below code
grants required privileges
defines a java stored function "Util.RunThis" which executes on database server a OS command passed into function and return string.
"Util.RunThis" is mapped to PL/SQL function "RUN_CMD"
"GET_PORT" is a PL/SQL function returning a numeric value of the used Port of the database server process connected to client session. Inside GET_PORT the SELECT is used to determine database server process pid replacing [SPID] in command below
/usr/sbin/lsof -Pan -p [SPID] -i
finally invoking a simple select we get the Port of database server process attached to current session
connect / as sysdba grant select on sys.v_$process to scott; grant select on sys.v_$session to scott; begin dbms_java.grant_permission ('SCOTT', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute'); end; / connect scott/tiger@foo.com create or replace and compile java source named "Util" as import java.io.*; import java.lang.*; import java.nio.charset.Charset; import java.nio.*; public class Util extends Object { public static String RunThis(String args) { Runtime rt = Runtime.getRuntime(); String rc = args; try { Process p = rt.exec(args); int bufSize = 4096; BufferedInputStream bis = new BufferedInputStream(p.getInputStream(), bufSize); int len; byte buffer[] = new byte[bufSize]; // Echo back what the program spit out while ((len = bis.read(buffer, 0, bufSize)) != -1) { String xxx = new String(buffer, Charset.forName("UTF-8")); rc = rc + xxx; } p.waitFor(); rc = rc + "ABC"; } catch (Exception e) { e.printStackTrace(); rc = "Exception!!!" ; } finally { return rc; } } } / create or replace function RUN_CMD( p_cmd in varchar2) return VARCHAR2 as language java name 'Util.RunThis(java.lang.String) return java.lang.String'; / create or replace function GET_PORT return number as SPID NUMBER; retval varchar2(32000); y varchar2(1024); cmd VARCHAR2(256); begin SELECT p.spid INTO SPID FROM sys.v_$process p, sys.v_$session s WHERE s.paddr = p.addr and sys_context('USERENV', 'SID') = s.sid; cmd := '/usr/sbin/lsof -Pan -p [SPID] -i'; /* raw string data returned from Shell executing cmd */ retval := run_cmd(replace(cmd,'[SPID]', SPID)); /* get last occurance of : marking redirected port */ y := substr(retval,INSTR(retval,':', -1)+1,1024); /* return the numeric port by stripping info like " (ESTABLISHED)" */ return to_number(substr(y,1,INSTR(y, ' ')-1)); end; / show errors select get_port from dual; /*-------------------- OUTPUT -------------------------- */ SQL> connect / as sysdba grant select on sys.v_$process to scott; grant select on sys.v_$session to scott; begin dbms_java.grant_permission ('SCOTT', 'SYS:java.io.FilePermission', '<<ALL FILES>>', 'execute'); end; /Connected. SQL> SQL> Grant succeeded. SQL> SQL> Grant succeeded. SQL> SQL> 2 3 4 5 6 7 8 PL/SQL procedure successfully completed. SQL> connect scott/tiger@foo.com Connected. SQL> create or replace and compile java source named "Util" 2 as import java.io.*; import java.lang.*; import java.nio.charset.Charset; 3 4 5 6 import java.nio.*; 7 public class Util extends Object 8 { 9 public static String RunThis(String args) { Runtime rt = Runtime.getRuntime(); 10 11 12 String rc = args; 13 14 try 15 { 16 17 Process p = rt.exec(args); 18 19 int bufSize = 4096; 20 BufferedInputStream bis = 21 new BufferedInputStream(p.getInputStream(), bufSize); 22 int len; byte buffer[] = new byte[bufSize]; 23 24 // Echo back what the program spit out while ((len = bis.read(buffer, 0, bufSize)) != -1) 25 26 27 { 28 String xxx = new String(buffer, Charset.forName("UTF-8")); 29 rc = rc + xxx; 30 } p.waitFor(); 31 32 rc = rc + "ABC"; 33 34 35 } 36 catch (Exception e) 37 { 38 e.printStackTrace(); 39 rc = "Exception!!!" ; 40 } 41 42 finally 43 { 44 return rc; 45 } } 46 47 } / 48 Java created. SQL> create or replace function RUN_CMD( p_cmd in varchar2) return VARCHAR2 as language java name 'Util.RunThis(java.lang.String) return java.lang.String'; / 2 3 4 Function created. SQL> create or replace function GET_PORT return number as SPID NUMBER; retval varchar2(32000); 2 3 4 5 y varchar2(1024); cmd VARCHAR2(256); begin 6 7 8 SELECT p.spid INTO 9 10 11 SPID FROM sys.v_$process p, sys.v_$session s WHERE 12 13 14 15 16 s.paddr = p.addr and sys_context('USERENV', 'SID') = s.sid; cmd := '/usr/sbin/lsof -Pan -p [SPID] -i'; 17 18 19 20 21 /* raw string data returned from Shell executing cmd */ retval := run_cmd(replace(cmd,'[SPID]', SPID)); 22 23 24 /* get last occurance of : marking redirected port */ y := substr(retval,INSTR(retval,':', -1)+1,1024); /* return the numeric port by stripping info like " (ESTABLISHED)" */ 25 26 27 28 return to_number(substr(y,1,INSTR(y, ' ')-1)); end; / show errors 29 30 Function created. SQL> No errors. SQL> select get_port from dual; GET_PORT ---------- 36586
回答2:
I solve this problem adding on my Weblogic configuration JDBC the additional parameters (host, user, port, sid - the password is returned automaticaly). And I got this values throw this code below:
import weblogic.jdbc.wrapper.PoolConnection;
import java.util.Properties;
(...)
public Properties retornaPropriedadesConexao(){
PoolConnection pc = (PoolConnection)conn;
Properties p = pc.getConnectionEnv().getDriverProperties();
return p;
}
来源:https://stackoverflow.com/questions/64246169/how-to-retrieve-host-port-sid-user-and-password-informations-in-java-sql-conn