如何判断何时存在连接数据库问题?

时间:2016-03-01 13:57:01

标签: java hibernate exception logging

当数据库连接问题发生时,如数据库服务器关闭而不是SQL问题,我需要进行特殊处理。

在源代码中,我们可以获得各种异常,但哪些异常属于连接异常?

我们希望如果出现这种问题,可以减少日志。

已编辑

我有很多方法可以执行与数据库的连接,但是所有方法都从同一个方法(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;
}

1 个答案:

答案 0 :(得分:1)

多种可能的方式。

  • 使用Java Connection isValid方法。
  • 使用连接池 - 所有主要连接 池支持此功能(包括c3p0和dbcp)。他们可以 throw SQLException有getErrorCode()和getSQLState()方法
  • 编写Java代码&经常轮询 - 下面的示例代码

运行参数示例:jdbc:oracle:thin:@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部分的详细信息 没有在Hibernate中完成,但准确地说,您可以检入连接池配置。

如果使用c3p0,那么请检查如何最好地使用idle_test_period,preferredTestQuery和testConnectionOnCheckout等设置; 如果使用dbcp,那么validationQuery可以完成这项工作。

如果你想将c3p0与Hibernate和Spring一起使用,请检查this链接