web-dev-qa-db-ja.com

Javaを使用してOracleデータベースへの接続をテストする方法

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つあります。

11
Bimbz

車輪を再発明しないでください。 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)))
8
Joshua Huber

_DriverManager#getConnection_は、指定されたデータベースURLへの接続を確立しようとします。 DriverManagerは、登録されているJDBCドライバーのセットから適切なドライバーを選択しようとします。データベースアクセスエラーが発生した場合はSQLExceptionを確認します。

Connection#isValid(int timeout) を使用して、接続が有効かどうかをテストできます。接続が閉じられておらず有効な場合はtrueを返します。

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

簡単なJava Oracle DBへの接続を確認するコード:

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    
        }    
      }    
    }            
  }    
}
8
xDBA

上記のコードサンプルが行うことを行うために、ミニコマンドラインアプリを作成しました。

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

コーディングする人を節約します。 (mavenで)ビルドして実行するだけです。

1
RogerIsDead

...そして、そうでない場合、プログラムは次に接続します...」複数のサーバーアドレスを含むクラスター接続文字列があなたのために働く。 (私はこれを自分で試しませんでした。) RAC環境のOracle接続文字列 を見てください。

0
halfbit

接続のテストでは、dbへの接続とこの接続のテストの2つの方法を作成して使用します。

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()-最初の部分は接続が正しいことを確認し、2番目の部分はデータベースの操作の正確性を確認します。接続は可能ですが、リクエストにアクセスすることはできません。

0

データベースサーバーIPの配列を作成し、それらを反復処理できます。接続に失敗するたびに、アレイから次のIPに進み、再試行できます。接続が成功した場合、そこでループを切断し、確立された現在の接続を使用します。

0
SudoRahul

たぶん、サーバーのIPアドレスをpingする必要があります。これを確認する必要があります: ping関数は、pingされたすべてのIPアドレスが到達可能であることを返します

0
Lei Leyba

DriverManager.getConnection()から SQLException をキャッチし、 ORA-1254 を探します。
ベンダーコードに関するSQLExceptionドキュメントを参照してください。

0
Class.forName("Oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(“url”,”username”,”password ″); 

こちらをご覧ください: http://leezk.com/tag/jdbc

0
liunkor