How to retrieve host, port, sid, user and password informations in java.sql.Connection

↘锁芯ラ 提交于 2021-02-05 11:26:07

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!