13

有没有办法使用 Java 测试我与 oracle 数据库的连接?这是我的代码。

public class OracleConnection {

    public static void main(String[] args) throws Exception {
        //connect to database
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String serverName = "00.000.0.000";
        String portNumber = "1521";
        String sid = "My Sid";
        String url = "jdbc:oracle:thin:@" + serverName + ":" + portNumber + ":" + sid;
        String username = "UNAME";
        String password = "PASSWORD";
        Connection conn = DriverManager.getConnection(url, username, password);
    }
}

我想要做的是测试数据库是否可以访问,如果不是,那么程序将连接到下一个数据库。我有 8 个生产数据库。

4

10 回答 10

19

DriverManager#getConnection它自己尝试建立到给定数据库 URL 的连接。DriverManager 尝试从已注册的 JDBC 驱动程序集中选择合适的驱动程序。SQLException如果发生数据库访问错误,则 thorws 。

您可以测试您的连接是否有效,Connection#isValid(int timeout)如果连接尚未关闭并且仍然有效,则返回 true。

...
Connection conn = DriverManager.getConnection(url, username, password);
boolean reachable = conn.isValid(10);// 10 sec
于 2013-09-12T05:40:36.210 回答
9

用于检查与 Oracle DB 的连接的简单 Java 代码:

import java.sql.*;    
public class Test {
  private final static String DB_URL = "jdbc:oracle:thin:@//192.168.1.105:1521/MYORA";
  private final static String USER = "myuser";
  private final static String PASS = "mypwd";

  public static void main(String[] args) {
    Connection conn = null;  
    try {    
      Class.forName("oracle.jdbc.driver.OracleDriver");    
      System.out.println("Connecting to database...");    
      conn = DriverManager.getConnection(DB_URL,USER,PASS);    
    } catch (Exception e) {    
      e.printStackTrace();    
    } finally {    
      if (conn != null) {    
        try {    
          conn.close();    
        } catch (SQLException e) {    
          // ignore    
        }    
      }    
    }            
  }    
}
于 2014-06-16T18:55:43.727 回答
8

不要重新发明轮子。Oracle 的 JDBC 驱动程序已经内置了这个功能。

这很有用:http ://www.orafaq.com/wiki/JDBC

import java.util.ArrayList;
import java.sql.*;

public class OracleConnection {

    public static void main(String[] args) throws Exception {
        //connect to database
        Class.forName("oracle.jdbc.driver.OracleDriver");
        ArrayList<String> serverNames = new ArrayList<String>();
        serverNames.add("yourhostname1");
        serverNames.add("yourhostname2");
        serverNames.add("yourhostname3");
        serverNames.add("yourhostname4");
        String portNumber = "1521";
        String sid = "ORCLSID";
        String url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=ON)(FAILOVER=ON)" ;
        for (String serverName : serverNames) {  
            url += "(ADDRESS=(PROTOCOL=tcp)(HOST="+serverName+")(PORT="+portNumber+"))";
        }
        url += ")(CONNECT_DATA=(SID="+sid+")))";
        String username = "USERNAME";
        String password = "PASSWORD";
        // System.out.println(url); // for debugging, if you want to see the url that was built
        Connection conn = DriverManager.getConnection(url, username, password);
    }
}

上面的代码实际上构建和使用看起来像这样的 url(如下例所示)。我通过取消注释代码末尾附近的调试行明确地得到了这一点:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
    (LOAD_BALANCE=ON)(FAILOVER=ON)
    (ADDRESS=(PROTOCOL=tcp)(HOST=yourhostname1)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=yourhostname2)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=yourhostname3)(PORT=1521))
    (ADDRESS=(PROTOCOL=tcp)(HOST=yourhostname4)(PORT=1521))
  )(CONNECT_DATA=(SID=ORCLSID)))
于 2014-06-17T17:16:30.963 回答
3

我编写了一个迷你命令行应用程序来完成上述代码示例的工作。

https://github.com/aimtiaz11/oracle-jdbc-tester

保存任何编码它的人。只需构建(使用 Maven)并运行它。

于 2018-03-29T22:55:26.210 回答
0

您可以拥有数据库服务器 ips 的数组并对其进行迭代。对于每次失败的连接尝试,您都可以从阵列中转到下一个 ip 并重试。如果连接成功,则在此处中断循环并使用已建立的当前连接。

于 2013-09-12T05:41:29.730 回答
0

也许您应该 ping 服务器的 IP 地址。您应该检查一下: Ping 函数返回所有 ping 的 IP 地址都可以访问

于 2013-09-12T05:43:44.113 回答
0

您可以从中捕获SQLExceptionDriverManager.getConnection()并查找ORA-12543
阅读有关供应商代码的 SQLException 文档。

于 2013-09-12T05:44:38.460 回答
0
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(“url”,”username”,”password ″); 

在这里查看更多:http: //leezk.com/tag/jdbc

于 2013-09-12T05:48:13.570 回答
0

...如果不是,那么程序将连接到下一个... ” 我想知道包含多个服务器地址的集群连接字符串是否适合您。(我自己没有尝试过。)查看Oracle Connection String for RAC Environment

于 2013-09-12T06:12:28.543 回答
0

为了测试连接,我将创建并使用 2 种方法:连接到 db 和测试此连接:

Class Connector {
private static final String CONNECTION_STRING = "jdbc:oracle:thin:@//%s:%d/%s";
private static final String QUERY_IS_CONNECTED = "SELECT * FROM table WHERE field = 'example'";
private static final Log LOG = LogFactory.getLog(Connector.class);

public Connection createConnection() {
    Connection connection = null;
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
        connection = DriverManager.getConnection(String.format(CONNECTION_STRING, "127.0.0.1", "1521", "dbName"), "userName", "password");
    } catch (Exception e) {
        LOG.error("createConnection: connection error");
    }

 return connection;
}

public boolean isConnected() {

        try (Connection connection = createConnection()) {
            if (connection.isClosed()) {
                    return false;
            }

            try (Statement statement = connection.createStatement();
                 ResultSet resultSet = statement.executeQuery(QUERY_IS_CONNECTED)) {
                if (resultSet == null) {
                    return false;
                }
            } catch (Exception e) {
                LOG.error("isConnected: Query error", e);
                return false;
            }
        } catch (Exception e) {
            LOG.error("isConnected: Check connection error", e);
            return false;
        }

        return true;
    }
}

createConnection() - 到您的数据库的默认连接。ip、port、dbName、userName 和 password 的值将是您的。

isConnected() - 第一部分检查您的连接是否正确,第二部分检查使用数据库的正确性。因为可以有连接,但不能访问请求。

于 2018-11-30T10:50:28.663 回答