2016-03-01 46 views
-2

當數據庫連接問題發生時,如數據庫服務器關閉而不是SQL問題,我需要做一個特殊處理。如何判斷何時存在連接數據庫問題?

在源代碼中,我們可以得到各種例外,但哪些屬於連接?

我們希望如果出現這種問題會減少日誌。

EDITED

我有執行連接到數據庫,但都得到了同樣的方法(initSession)會議許多方法: 下面的例子:

private Session initSession(HibernateUtil hibernateUtil) { 
     Session oSession = null; 
     try { 
      oSession = hibernateUtil.getSession(); 
     } catch (Exception e) { 
      log.error("unable to log, Please check the details of your database"); 
     } 
     return oSession; 
} 


public List findAlerts(int pFirstLine, int pNbElement) throws AnalyzerException { 

     List oAlerts = new ArrayList(); 
     Session oSession = initSession(lHibernateUtil); 
     try { 
      oAlerts = AlertFinders.instance().findAlertByStatus(oSession, false, pFirstLine, pNbElement); 
      Iterator iterAlerts = oAlerts.iterator(); 
      while (iterAlerts.hasNext()) { 

       ... 
      } 
     } catch (UnableToLocateObjectException eU) { 
      throw new AnalyzerException(eU.getMessageSource(), eU.getClassNameSource(), eU.getMethodSource(), eU); 
     } finally { 
      oSession.close(); 
     } 
     return oAlerts; 
} 
+0

請找上面 – kkung

回答

1

多種可能的方式。

  • 使用Java Connection isValid方法。
  • 使用連接池 - 所有主要連接 池支持此功能(包括C3P0和DBCP)。他們可以 拋出SQLException有getErrorCode用於()和getSQLState()方法
  • 編寫Java代碼&調查頻繁 - 下面
  • 示例代碼

運行參數樣品:JDBC:預言:瘦:@localhost:1521:XE系統mypassword123 oracle.jdbc.driver.OracleDriver

public class DbConnCheck { 
     public static void main(String[] args) throws Exception { 
      String url = args[0]; 
      String username = args[1]; 
      String password = args[2]; 
      String driver = args[3]; 

      Class.forName(driver); 
      Connection conn = DriverManager.getConnection(url, username, password); 
      try { 
       Statement statement = conn.createStatement(); 
       ResultSet rs = statement.executeQuery("SELECT SYSDATE FROM DUAL"); 
       while(rs.next()) { 
        System.out.println(rs.getObject(1)); 
       } 
      } finally { 
       conn.close(); 
      } 
     } 
    } 

編輯:在休眠部分添加細節 在Hibernate中沒有完成,但確切地說,您可以檢查連接池配置。

如果使用c3p0,然後檢查如何最好地使用設置,如idle_test_period,preferredTestQuery和testConnectionOnCheckout; 如果使用dbcp,那麼validationQuery可以完成這項工作。

如果你想用C3P0與Hibernate和Spring檢查this鏈接

+0

只是一個問題的代碼:在什麼階段,我們可以檢測訪問數據庫的問題嗎?從SessionFactory獲取會話時,獲取Connection對象時。 – kkung

+0

更新了我的答案。 –

+0

我們已經使用c3p0,並且idle_test_period設置爲5秒,testConnectionOnCheckout似乎只能用於hibernate 2.x. ___假設這種情況:我們有X池連接,並且我的應用程序正在進行。但突然間數據庫崩潰了。會發生什麼 ? ___每5秒鐘進行一次測試,但這是否意味着所有X連接都將被刪除? 如果數據庫仍然沒有恢復,我的應用程序將嘗試創建新的連接,這將引發異常? – kkung