Java 如何在jdbc驱动程序加载中实现快速失败策略?
我正在练习java web应用程序,我有一个关于DAO对象和JDBC的问题 当我的web应用程序无法加载MySQL驱动程序类时,我想根据“快速失败”策略终止web应用程序。为此,使用Java 如何在jdbc驱动程序加载中实现快速失败策略?,java,jdbc,Java,Jdbc,我正在练习java web应用程序,我有一个关于DAO对象和JDBC的问题 当我的web应用程序无法加载MySQL驱动程序类时,我想根据“快速失败”策略终止web应用程序。为此,使用Class.forName(DB\u驱动程序)的ClassNotFoundException不应被try catch捕获 (添加更多解释) 但是,代码有一个逻辑错误,没有try catch。eclipse IDE中有红色下划线,带有未处理的异常类型ClassNotFoundException。我不知道如何实现“快速失
Class.forName(DB\u驱动程序)的ClassNotFoundException
代码>不应被try catch
捕获
(添加更多解释)
但是,代码有一个逻辑错误,没有try catch
。eclipse IDE中有红色下划线,带有未处理的异常类型ClassNotFoundException
。我不知道如何实现“快速失败”
我的问题是
如何实现Class.forName(DB\u驱动程序)代码>,哪个类、方法。。。等
(我不想执行每个数据请求)
采用快速失效策略是否合适
如果是这样,当代码抛出ClassNotFoundException
时,如何终止它
我使用ApacheTomcat,下面是我的代码
TodoDao.java
公共类TodoDao{
private static final String GET_TODOS=“选择id、title、name、regDate、sequence、type”
+“从待办事项”
+“按注册日期说明订购;”;
公共TodoDao(){
DBConnection.updateDriver();//快速失败
}
公共列表getTodos(){
//…跳过
}
}
DBConnection.java
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
公共类数据库连接{
私有静态最终字符串DB_DRIVER=“com.mysql.cj.jdbc.DRIVER”;
私有静态最终字符串DB_URL=“jdbc:mysql://localhost/boostcourse"
+“?useSSL=false&serverTimezone=UTC&characterEncoding=utf8”;
私有静态最终字符串DB_USER=“testuser”;
私有静态最终字符串DB_PASSWD=“test1234!”;
public static final void updateDriver()引发ClassNotFoundException{
类forName(DB_驱动程序);
}
公共静态最终连接getConnection()引发SQLException{
return(Connection)DriverManager.getConnection(DB_URL、DB_USER、DB_PASSWD);
}
}
java(调用dao)
/…跳过
@WebServlet(UriInfo.MAIN)
公共类MainServlet扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
公共MainServlet(){
超级();
}
@凌驾
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
TodoDao=新TodoDao();
List todos=dao.gettoos();
setAttribute(“todos”,todos);
RequestDispatcher=request.getRequestDispatcher(“WEB-INF/main.jsp”);
转发(请求、响应);
}
}
有两种方法:
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
的唯一目的似乎是强制加载数据库驱动程序。那么为什么不按照第一个解决方案声明它呢。。。并处理调用方中的异常。。。大概是在一个可以处理配置错误的地方;e、 g.放弃servlet初始化。“但是,没有try-catch,代码会出错。”什么错误?请提供一个和所有相关信息。@标记这只是关于未处理异常的逻辑错误。我认为如果我发现并处理了错误,web应用程序不会关闭。所以我不想处理这个异常。我在问题中添加了更多的描述。这是我的猜测,但在询问堆栈溢出问题时,明确说明您的问题很重要。你会更快地得到答案,而且可以通过搜索引擎找到问题。你能帮我更多吗?我正在尝试第二种方法,声明我的自定义异常名为DriverNotLoadedException
。但是我得到了一个错误-未处理的异常类型DriverNotLoadedException
,运行之后我得到了一个错误-java.lang。错误:未解决的编译问题:未处理的异常类型DriverNotLoadedException
。。。我应该如何解决它?您希望它是一个未检查的异常,因此它需要将RuntimeException
作为其超类(直接或间接)。看见