Перезапуск для доступа к базе данных - PullRequest
0 голосов
/ 07 марта 2012

Я пытаюсь получить доступ к базе данных оракула, см. Мой код ниже.

Проблема в том, что база данных является кластерной БД, поэтому, если одна из них не работает, вы можете получить доступ к другой. В настоящее время проблема заключается в том, чтобы остаться на одном узле, поэтому могу ли я обновить свой Java-код и, если он не проходит, проверить еще раз, пока не будет установлено соединение?

Я использую файл свойств для вставки учетных данных в базу данных. Когда соединение установлено, вводится запрос и возвращается результат.

public static String connectDB(String configFile, String query) throws FileNotFoundException, IOException, SQLException, ClassNotFoundException{
    Properties p = new Properties();
    p.load(new FileInputStream(configFile));

    String serverName = (p.getProperty("RMS_DBServerName"));
    String portNumber = (p.getProperty("RMS_PortNumber"));
    String sid = (p.getProperty("RMS_SID"));
    String url = "jdbc:oracle:thin:@//" + serverName + ":" + portNumber + "/" + sid;
    String username = (p.getProperty("RMS_Username"));
    String password = (p.getProperty("RMS_Password"));

    Class.forName("oracle.jdbc.driver.OracleDriver");
    sleep(10);
    Connection connection = DriverManager.getConnection(url,username,password);
    sleep(5);
    String setr = null;
    try {      
        Statement stmt = connection.createStatement();
        try {
            ResultSet rset = stmt.executeQuery(query);
            try {
                    while(rset.next())   
                    setr = rset.getString(1);
                    return setr;  
            }        
            finally {
                try { 
                    rset.close(); 
                } 
                catch (Exception ignore) {}
            }
        } 
        finally {
            try { 
                stmt.close(); 
            } 
            catch (Exception ignore) {}
        }
    } 
    finally {
        try { 
            connection.close(); 
        } 
        catch (Exception ignore) {}
    }
}   

1 Ответ

0 голосов
/ 07 марта 2012

Я не уверен, что понимаю вас, но java.​sql.​DriverManager выдает SQLException "если возникает ошибка доступа к базе данных".Таким образом, вы можете сделать что-то вроде:

public static String connectDB(String configFile, String query) 
    try{
      Connection connection = DriverManager.getConnection(url,username,password);
    } catch (SQLException ex) {
     sleep(10);
     connectDB(configFile,query); // try to connect again
    }

или что-то вроде:

//dbPrefix is something that you put before name of every property associated to given node in your config file.
public static String connectDB(String configFile, String dbPrefix, String query) ... {
...
    String serverName = (p.getProperty(dbPrefix + "RMS_DBServerName"));
        String portNumber = (p.getProperty(dbPrefix + "RMS_PortNumber"));
        String sid = (p.getProperty(dbPrefix + "RMS_SID"));
        String url = "jdbc:oracle:thin:@//" + serverName + ":" + portNumber + "/" + sid;
        String username = (p.getProperty(dbPrefix + "RMS_Username"));
        String password = (p.getProperty(dbPrefix + "RMS_Password"));
...

        try{
          Connection connection = DriverManager.getConnection(url,username,password);
        } catch (SQLException ex) {
         sleep(10);
         connectDB(configFile,dbPrefix,query); // try to connect again, use different node
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...