我正在练习Java的web应用程序,我有一个关于DAO对象和JDBC的问题。
当我的web应用程序加载MySQL驱动程序类失败时,我想根据“快速失败”策略终止web应用程序。 为此,try-catch
不应捕获类。ForName(DB_DRIVER);
的类NotFoundException
。
但是,代码在没有try-catch
的情况下出错。。。 我不知道如何实现“快速失败”。
我的问题是。。。
类。forName(DB_DRIVER);
,哪个类,方法,等等?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);
}
}
有两种方法:
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初始化。