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

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。我不知道如何实现“快速失

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

当我的web应用程序无法加载MySQL驱动程序类时,我想根据“快速失败”策略终止web应用程序。为此,使用
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
    作为其超类(直接或间接)。看见