Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment faire oracle TNSPING avec java?

TNSPING valide uniquement la connexion réseau au processus d'écoute, vous n'avez pas besoin de transmettre le nom d'utilisateur et le mot de passe.

Comme le dit @KonstantinV.Salikhov, vous pouvez coder un outil comme celui-ci, il vérifiera :

.- La connexion réseau au processus d'écoute (si l'écouteur est UP ou non comme le ferait TNSPING)
.- Le service de base de données est UP ou non (car TNSPING identifierait le nom du service de base de données).

L'outil n'utilisera pas de nom d'utilisateur/mot de passe car nous n'avons besoin que de l'événement d'échec de connexion pour valider que la base de données est opérationnelle.

CODE JAVA :

import java.sql.*;
import oracle.jdbc.pool.*;

public class ThinTnsnames {

    static String sql = null;

    public static void main(String[] args) {
        String entry_name = args[0];
        test(entry_name);
    }

    public static void test(String entry_name) {
        Connection pconnection = null;
        try {
            String l_url = "jdbc:oracle:thin:@" + entry_name;
            System.out.println( "Connection string = " + l_url );

            OracleDataSource ods = new OracleDataSource();
            ods.setURL(l_url);
            pconnection = ods.getConnection ();
        }
        catch(SQLException e) {
            int errorCode = e.getErrorCode() ;
            System.err.println("Error Code: " + errorCode) ;
            if ( errorCode == 12514 ) {
                System.err.println("Listener is UP but database is DOWN");
            }
            if ( errorCode == 17002 ) {
                System.err.println("Listener is DOWN");
            }
           if ( errorCode == 1017 ) {
                System.err.println("Listener is UP and database is UP");
            }
        }
        finally {
            try {
                if ( pconnection != null ) {
                    pconnection .close();
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Vous pouvez utiliser votre propre fichier tnsnames.ora dans un autre répertoire pour le tester, par exemple dans le répertoire "/home/oracle/2" :

[[email protected] 2]$ cat /home/oracle/2/tnsnames.ora

orcldb =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ora12c.node.com)(PORT = 15300))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = db02.node.com)
      (INSTANCE_NAME = db02)
    )
  )

Et puis vous l'invoquez de cette façon :

export JAVA_HOME=/opt/java/jdk1.7.0_71
export PATH=$JAVA_HOME/bin:$PATH

export CLASSPATH=/home/oracle/2/ojdbc7.jar:.

java -Doracle.net.tns_admin=/home/oracle/2 ThinTnsnames orcldb

Les sorties possibles sont :

Connection string = jdbc:oracle:thin:@orcldb
Error Code: 1017
Listener is UP and database is UP

Connection string = jdbc:oracle:thin:@orcldb
Error Code: 12514
Listener is UP but database is DOWN

Connection string = jdbc:oracle:thin:@orcldb
Error Code: 17002
Listener is DOWN

Vous pouvez vérifier qu'aucun nom d'utilisateur n'est utilisé lors de la connexion en interrogeant la vue dba_audit_trail comme suit :

select username,action_name,returncode from dba_audit_trail
where action_name like 'LOG%' ;

USERNAME             ACTION_NAME                  RETURNCODE
-------------------- ---------------------------- ----------
                     LOGON                              1017