提问者:小点点

如何在jdbc驱动程序加载中实现快速失败策略?


我正在练习Java的web应用程序,我有一个关于DAO对象和JDBC的问题。

当我的web应用程序加载MySQL驱动程序类失败时,我想根据“快速失败”策略终止web应用程序。 为此,try-catch不应捕获类。ForName(DB_DRIVER);类NotFoundException

但是,代码在没有try-catch的情况下出错。。。 我不知道如何实现“快速失败”。

我的问题是。。。

  1. 如何实现类。forName(DB_DRIVER);,哪个类,方法,等等?
    (我不想执行每个数据请求)
  2. 应用快速失败策略是否合适?
  3. 如果是,如何在代码抛出ClassNotFoundException时终止它?

我使用Apache Tomcat,下面是我的代码。


public class TodoDao {
    // ...skip

    public TodoDao() {
        DBConnection.updateDriver();  // fast-fail
    }

    // ...skip
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {
    private static final String DB_DRIVER = "com.mysql.cj.jdbc.Driver";
    
    //...skip
    
    public static final void updateDriver() throws ClassNotFoundException {
        Class.forName(DB_DRIVER);
    }
    
    public static final Connection getConnection() throws SQLException {
        return (Connection) DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWD);
    }
}

共1个答案

匿名用户

有两种方法:

public TodoDao() throws ClassNotFoundException {
    DBConnection.updateDriver();  // fast-fail
}

这种方法只是把问题推迟了。 现在TodoDAO的调用方必须处理它。

public TodoDao() {
    try {
        DBConnection.updateDriver();  // fast-fail
    } catch (ClassNotFoundException ex) {
        throw new RuntimeException("Cannot load JDBC driver class", ex);
    }
}

这种方法将异常作为未检查的异常重新抛出,以便调用方不必处理它。 您可以(而且可能应该)声明并使用自定义的未检查异常,而不是抛出RuntimeException

但是,在我看来,TodoDAO的唯一目的似乎是强制加载数据库驱动程序。 所以为什么不按照第一个解决方案声明它。。。并在调用方中处理异常。。。这大概是在一个您可以处理配置错误的地方; 例如放弃servlet初始化。