首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在jdbc驱动程序加载中实现快速失败策略?

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

Stack Overflow用户
提问于 2020-06-27 13:36:07
回答 1查看 116关注 0票数 0

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

当我的web应用程序无法加载MySQL驱动程序类时,我想按照‘快速失败’策略终止web应用程序。因此,ClassNotFoundException of Class.forName(DB_DRIVER);不应该被try-catch抓住。

(添加更多解释)

但是,在没有try-catch的情况下,代码有一个逻辑错误。在带Unhandled exception type ClassNotFoundException的eclipse中有红色下划线。我不知道如何实现‘快速失败’。

我的问题是..。

  1. 如何实现Class.forName(DB_DRIVER);,哪个类,哪个方法,.等?(我不想执行每个数据请求)
  2. 应用一个快速失败的策略合适吗?如果是的话,当代码抛出

时如何终止它?

我使用,这是我的代码。

TodoDao.java

代码语言:javascript
复制
public class TodoDao {    
    private static final String GET_TODOS = "SELECT id, title, name, regDate, sequence, type"
                                         + " FROM   todo"
                                         + " ORDER  BY regdate DESC;";

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

    public List<TodoDto> getTodos() {
        // ...skip
    }
}

DBConnection.java

代码语言:javascript
复制
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";
    private static final String DB_URL = "jdbc:mysql://localhost/boostcourse"
                                       + "?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
    private static final String DB_USER = "testuser";
    private static final String DB_PASSWD = "test1234!";
    
    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);
    }
}

MainServlet.java(呼叫道)

代码语言:javascript
复制
// ...skip

@WebServlet(UriInfo.MAIN)
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public MainServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        TodoDao dao = new TodoDao();
        List<TodoDto> todos = dao.getTodos();

        request.setAttribute("todos", todos);

        RequestDispatcher requestDispatcher = request.getRequestDispatcher("WEB-INF/main.jsp");
        requestDispatcher.forward(request, response);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-27 13:52:21

有两种方法:

代码语言:javascript
复制
public TodoDao() throws ClassNotFoundException {
    DBConnection.updateDriver();  // fast-fail
}

这种方法只是推迟了问题的发生。现在,TodoDao的调用者必须处理它。

代码语言:javascript
复制
public TodoDao() {
    try {
        DBConnection.updateDriver();  // fast-fail
    } catch (ClassNotFoundException ex) {
        throw new RuntimeException("Cannot load JDBC driver class", ex);
    }
}

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62610738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档