Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用java实现oracle TNSPING?_Java_Oracle - Fatal编程技术网

如何使用java实现oracle TNSPING?

如何使用java实现oracle TNSPING?,java,oracle,Java,Oracle,我有一个数据库TNSEntries的详细信息。我需要用Java编写代码来检查TNSPING。有什么办法吗 示例TNSENtry: orcldb= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = myhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = myservice) (INSTANCE_NAME = myinstance) ) ) 我

我有一个数据库
TNSEntries
的详细信息。我需要用Java编写代码来检查
TNSPING
。有什么办法吗

示例
TNSENtry

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

我已经使用jdbc oracle驱动程序使用用户名和密码完成了oracle连接。这个TNSPING对我来说是新的,它没有用户名和密码。您可以请任何人帮助用java编写TNSPING吗?

TNSPING只验证到侦听器进程的网络连接,您不需要传递用户名和密码

正如@konstantiv.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");
            }
        }
        finally {
            try {
                if ( pconnection != null ) {
                    pconnection .close();
                }
            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
    }
}
您可以在另一个目录中使用自己的tnsnames.ora文件进行测试,例如在“/home/oracle/2”目录中:

[oracle@ora12c 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\u audit\u trail view,您可以验证在连接过程中没有使用用户名,如下所示:

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

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

您可以使用随机用户名和密码连接到数据库,并检查是否返回了ORA-01017(无效用户名/密码)-如果返回了ORA-01017,则表明您的数据库已启动并正在运行,否则数据库或网络连接存在某种问题
tnsping
是一个OS命令。可能实现这一点的标准方法是在
tnsnames.ora
文件上运行一个shell脚本
grep
,并在一个循环中ping服务。@KonstantinV.Salikhov我得到了带有随机用户名和密码的ora-01017,但是还有其他方法吗?有时DB会因为错误的凭证尝试而被锁定(也许我错了)。为什么需要它?tnsping是诊断工具。这不是为了日常事务,谢谢丹尼尔的努力。此代码将尝试使用虚拟用户id和密码连接数据库,数据库将抛出错误,并基于此错误代码识别输出。我的问题是,如果试图连接错误的凭据,数据库是否不会被锁定?@Mohan否,此代码没有使用用户名登录。它只发送一个“空白”用户名,因此不可能锁定任何数据库帐户。我更新了我的答案,注意到了这些信息。