2017-07-22 102 views
-3

我正在使用Oracle數據庫的Java項目。當我創建一個新的Oracle驅動程序:當JDBC驅動程序無效時該怎麼辦?

jdbcDriver driver = new jdbcDriver(); 

...我檢查一下,看它是否使用有效:

if (!driver.isValid()) 
{ 
    throw new UncheckedSqlException("jdbcDriver not valid"); 
} 

什麼是正確的程序,如果司機是無效的?也就是說,由於數據庫不可用,因此無法存儲數據並在以後異步重試(即不鎖定應用程序)。假設如果我只是重試幾次,我會得到一個有效的驅動程序?

UPDATE

感謝EJP爲正確指出jdbcDriver是在我的代碼的類。這是正確的 - 它是我正在處理的代碼庫中的一個類。 EJP要求公佈相關細節。他們來了。

package us.mydev.jdbc.util; 

import java.sql.*; 
import javax.naming.*; 
import javax.sql.*; 

import org.apache.log4j.Logger; 
import us.mydev.data.exception.UncheckedSqlException; 

public class jdbcDriver 
{ 
    [.....] 
    public jdbcDriver() 
    { 
    try 
    { 
     m_iActiveConnections++; 
     if (showLogMessages) 
     { 
     log.debug("jdbcDriver() created, hashcode = " + this.hashCode() 
      + ",Active Connection Count is " + m_iActiveConnections); 
     log.debug("Data Source is " + DS_STANDARDUSER); 
     } 

     InitialContext ctx = new InitialContext(); 
     DataSource ds = (DataSource)ctx.lookup(DS_STANDARDUSER); 

     mydevGetJDBCConn getConn = new sqlConn(ds); 
     m_conn = getConn.getConnection(); 
     m_iDatabaseType = getConn.getDBType(); 

    } 
    catch (NamingException _exp) 
    { // handle any errors 
     log.error("failed", _exp); 
    } 
    } 


    public boolean isValid() throws SQLException 
    { 
    return m_conn != null && m_conn.isValid(10); 
    } 

    [.....] 
} 

我發現這個代碼後:

jdbcDriver driver = new jdbcDriver(); 
boolean driverIsValid = driver.isValid(); 

... driverIsValid是false約一次在每1000個左右的數據庫訪問。我會想象這是我當前開發系統的一個工件 - 我讓Oracle在虛擬機上運行。

driverIsValid在這種情況下生產中是否會出現異常(或聽不到)?如果它不是聞所未聞的 - 它通常如何處理,因爲我無法將相關數據保存到數據庫 - 也就是說,我可以重試幾次數據庫連接,並期望得到一個?

更新#2

基於我所來自的響應瞭解到,我需要不使用從代碼庫我的工作定義的對象代碼來問這個問題。我會接受羅文彬提供的答案,並更恰當地重提問題。

+5

是什麼'jdbcDriver'? – Ravi

+0

什麼是'jdbcDriver'?你的意思是[java.sql.Driver](https://docs.oracle.com/javase/7/docs/api/java/sql/Driver.html)接口? – krokodilko

+0

如果你想訪問JDBC級別的數據庫(而不是像JPA,SpringData等更高級別的抽象),那麼也許你應該從這樣的事情開始:https://www.mkyong.com/jdbc/connect -to-oracle-db-via-jdbc-driver-java/ – riskop

回答

0

我認爲你的意思是,如果連接在檢查時仍然有效。 isValid方法返回連接是否可用。這個方法可以隨時調用,並允許你設置超時。 根據官方手冊,方法是

  1. 與重試機制特別有用。
  2. 與連接超時和連接收集功能一起使用時很有用。

您當然可以重試該方法,以便數據庫問題事後得到解決,但更一般的情況是您設置了超時,之後您可能需要採取適當的操作並關閉連接。

try { conn = poolDataSouorce.getConnection ... } catch (SQLException sqlexc) 
{ 
    if (conn == null || !((ValidConnection) conn).isValid())   
     // take the appropriate action 
    conn.close 
} 

欲瞭解更多信息,請https://docs.oracle.com/cd/B28359_01/java.111/e10788/connect.htm#CHDIDEEB

+0

驅動程序在創建後立即失效的常見原因,例如這裏:'jdbcDriver driver = new jdbcDriver(); boolean isValid = driver.isValid();'? – VikR

+0

@VikR您告訴我們:這是您的代碼,而不是普通的JDBC驅動程序。我建議你拋開你的代碼,並開始使用來自數據源的普通JDBC連接,而不是引入 - 似乎是 - 不必要的複雜性。 –