2015-06-05 15 views
2

我有一个详细的数据库TNSEntries。我需要用Java编码来检查TNSPING。无论如何要这样做?如何用java做oracle TNSPING?

样品TNSENtry

orcldb= 
(DESCRIPTION = 
(ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521)) 
(CONNECT_DATA = 
    (SERVER = DEDICATED) 
    (SERVICE_NAME = myservice) 
    (INSTANCE_NAME = myinstance) 
) 
) 

我已经做了用户名和密码使用JDBC驱动程序甲骨文Oracle连接。这个TNSPING对我来说是新的,它没有用户名和密码。你能请任何人帮忙在java中编写TNSPING代码吗?

+0

您可以用随机的用户名和密码连接到数据库,并检查是否ORA-01017(无效的用户名/密码)被返回 - 如果是这样,那么你的数据库启动并运行,否则DB或网络连接有问题 –

+0

'tnsping'是一个OS命令。这样做的标准方式可能是在'tnsnames.ora'文件上运行'grep'并在循环中ping服务的shell脚本。 – APC

+0

@ KonstantinV.Salikhov我得到ORA-01017随机用户名和密码,但有没有其他方式呢?有时DB会因错误的凭据尝试而锁定(也许我错了)。 – Mohan

回答

1

TNSPING只验证Listener进程的网络连接,不需要传递用户名和密码。

正如@ KonstantinV.Salikhov说,你可能会类似于下面的代码的工具,它会验证:

.-网络连接监听器进程(如果听者是涨还是不喜欢TNSPING会做)
。 - 数据库服务是否启动(因为TNSPING将识别数据库服务名称)。

该工具不会使用用户名/密码,因为我们只需要登录失败事件来验证数据库已启动并正在运行。

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"); 
            } 
        // e.printStackTrace(); 
    } 
    finally { 
     try { 
     if (pconnection != null)pconnection .close(); 
     } 
     catch(Exception e) { 
     e.printStackTrace(); 
     } 
    } 
    } 

} 

您可以使用自己的tnsnames.ora文件在另一个目录来进行测试,例如在 “/家/ 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) 
    ) 
) 

然后你调用它是这样的:

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 

可能的输出是:

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 

您可以验证通过查询DBA_AUDIT_TRAIL视图连接过程中没有使用用户名如下:

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

USERNAME    ACTION_NAME     RETURNCODE 
-------------------- ---------------------------- ---------- 
        LOGON        1017 
+0

感谢Daniel的努力。此代码将尝试使用虚拟用户标识和密码连接数据库,数据库将引发错误,并根据错误代码识别输出。我的问题是,如果尝试连接错误凭据,数据库是否会锁定? – Mohan

+0

@莫汉不,此代码未使用用户名登录。它只是发送一个“空白”用户名,所以不可能锁定任何数据库帐户。我已经更新了我的答案,注意到这些信息。 –