如何使用 Java 测试与 Oracle 数据库的连接

Posted

技术标签:

【中文标题】如何使用 Java 测试与 Oracle 数据库的连接【英文标题】:How to test connection to Oracle Database using Java 【发布时间】:2013-09-16 08:36:24 【问题描述】:

有没有办法使用 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 个生产数据库。

【问题讨论】:

您应该基本上尝试连接到一个 IP 上的一个数据库,如果连接对象为空....然后尝试连接到另一个....也许连接代码应该是递归调用直到你得到一个有效的连接 但是它返回一个异常然后它会停止。 :( 是的,您需要处理异常并从 catch 块中再次调用递归函数 它也不起作用。我不明白为什么我尝试了“try catch”,但它仍然会停止工作。 【参考方案1】:

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

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

...
Connection conn = DriverManager.getConnection(url, username, password);
boolean reachable = conn.isValid(10);// 10 sec

【讨论】:

它说“类型连接的方法 IsValid() 未定义? Connection#isValid 方法自 java 1.6 起可用于 Connection 类。你用的是什么jdk版本? 我看我的JDK还是1.4哈哈哈哈!!我将首先更新我的 JDK。谢谢!! 如果我更改我的 JDK,它会影响我的代码或应用程序或我的机器上的任何东西吗?像日食会重置吗?很抱歉这个非常愚蠢的问题,但我真的是java中的新手。哈哈哈谢谢 捕获异常,我的意思是DriverManager#getConnection 抛出SQLException,正确处理这个异常...【参考方案2】:

用于检查与 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    
            
          
                
      

【讨论】:

赞成提供一个非常有用的关于构建连接 url 的示例。 像魅力一样工作。只需按照***.com/questions/17803818/… 中的说明添加对 ojdbc6.jar 的 lib 引用 这个网址对我不起作用。我在这里提到了docs.oracle.com/cd/E11882_01/appdev.112/e13995/oracle/jdbc/…。我不得不用冒号(:) 替换 /【参考方案3】:

不要重新发明***。 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)))

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

也许您应该 ping 服务器的 IP 地址。你应该检查一下: Ping function returns that all pinged IP addresses is reachable

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(“url”,”username”,”password ″); 

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

为了测试连接,我将创建并使用 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() - 第一部分检查正确连接,第二部分 部分检查使用数据库的正确性。因为可以 是一个连接,但不是请求的访问权限。

【讨论】:

以上是关于如何使用 Java 测试与 Oracle 数据库的连接的主要内容,如果未能解决你的问题,请参考以下文章

求一个连接oracle数据库的java类和一个测试是不是连接成功的JAVA类

如何实现测试隔离测试Oracle PL/SQL?

如何将 Oracle9i 与 JAVA 或 JSP 集成?

如何跳过测试代码或将 oracle 语法转换为 h2

如何在Oracle表中插入系统时间

Java 使用占位符操作数据库,表是oracle分区表。windows里测试正常,linux报错。。