Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何判断何时存在连接数据库问题?_Java_Hibernate_Exception_Logging - Fatal编程技术网

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

Java 如何判断何时存在连接数据库问题?,java,hibernate,exception,logging,Java,Hibernate,Exception,Logging,当数据库连接出现问题时,我需要进行特殊处理,例如数据库服务器关闭,而不是sql问题 在源代码中,我们可以得到各种异常,但哪些异常属于连接异常 如果出现这种问题,我们希望减少日志 已编辑 我有许多方法可以执行到数据库的连接,但都是从同一个方法(initSession)获取会话: 这里有一个例子: private Session initSession(HibernateUtil hibernateUtil) { Session oSession = null; tr

当数据库连接出现问题时,我需要进行特殊处理,例如数据库服务器关闭,而不是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;
}

多种可能的方式

  • 使用Java连接方法
  • 使用连接池-所有主要连接 池支持此功能(包括c3p0和dbcp) throw SQLException具有getErrorCode()和getSQLState()方法
  • 编写Java代码并经常轮询-下面是示例代码
运行参数示例:jdbc:oracle:thin:@localhost:1521:XE系统mypassword123 oracle.jdbc.driver.OracleDriver

编辑:添加有关hibernate部件的详细信息 不是在Hibernate中完成的,但准确地说,您可以检查连接池配置

如果使用c3p0,请检查如何最好地使用设置,如空闲时间、首选测试查询和测试连接取消检查; 如果使用dbcp,那么validationQuery可以完成这项工作


如果您想将c3p0与Hibernate和Spring check link一起使用

请查找上面的代码只是一个问题:在什么阶段我们可以检测到访问数据库的问题?当从SessionFactory获取会话时,当获取连接对象时..我们已经使用c3p0,空闲时间设置为5秒,testConnectionOnCheckout似乎只在hibernate 2.x上工作假设这个场景:我们有X个池连接,我的应用程序正在运行。但数据库突然崩溃了。会发生什么事每5秒将执行一次测试,但这是否意味着将删除所有X连接?如果数据库仍未恢复,我的应用程序将尝试创建新的连接,从而引发异常?
    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();
            }
        }
    }