【问题标题】:How to use try catch in Spring MVC mysql DAO connection?如何在 Spring MVC mysql DAO 连接中使用 try catch?
【发布时间】:2015-03-10 12:39:22
【问题描述】:

我正在学习 Spring MVC Web 开发并使用 mysql 数据库。我在 here 找到了一个很好的例子,可以在 spring 中使用 DAO 连接 mysql。

当我测试我的代码时,它运行良好。我很想走得更远,我想到了 SQL Connection 异常。所以我尝试在没有运行 mysql 的情况下访问 sql 测试页面,但在该页面上出现 500 错误。我看到的例外是

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

如果是生产网站,谁能告诉我应该把try{} catch(){} 块放在哪里以避免这种情况?

我尝试自己将这些代码放在 MVC 配置类中

   @Bean
    public DataSource getDataSource() {


        private DriverManagerDataSource dataSource;

        try{

        dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/contactdb");
        dataSource.setUsername("root");
        dataSource.setPassword("P@ssw0rd");
          }
         catch(Exception e){
          System.out.println("Connection error.");
          System.exit(0); 

        }
        finally{
         return dataSource;
         }
    }

但它不起作用所以任何人都可以帮助我并告诉我如何将它放入 try catch 块或更好的解决方案以避免此类错误?

提前谢谢你。

【问题讨论】:

    标签: java mysql database spring spring-mvc


    【解决方案1】:

    由于您使用的是 Spring,您可能应该阅读:

    问题不在于数据源本身的创建。当 Spring 定义这个 bean 时,很可能它甚至不会尝试创建连接。所以,这里不会失败。另外,仅仅吞下异常对您没有帮助,如果您按照自己的方法尝试使用数据源,稍后您会收到 NullPointerException。

    您的代码稍后可能会失败,无论您尝试使用数据源访问数据库。根据您实现存储库/数据访问层的方式,这甚至可能不会发生在您自己的代码中,而是发生在 Spring 代码的其他地方。

    您需要意识到,在服务层中,每次您访问数据访问层操作时可能会因多种原因而失败:数据库已关闭、连接超时、违反约束等。您不能简单地期望这将永远成功。所以,做好最坏的打算吧。

    这就是您可能定义尝试捕获策略的地方。这是执行此操作的最佳位置,因为您有足够的信息来说明究竟可能出了什么问题,您可以处理它或将异常包装到一个更具上下文的异常中,这将有助于以后诊断和解决问题。

    在那个地方的一个策略是重试您的交易。由于您已经在使用 Spring,您可以考虑使用 spring-retry 之类的东西。

    有些异常会提示重试。例如连接超时,或者数据库暂时关闭等。其他类型的异常重试没有任何意义,例如数据库约束违规异常。无论您为后者重试失败的事务多少次,它总是会失败。因此,使用 Spring 重试,您可以轻松配置这些类型的东西。

    您可以阅读 Spring 如何为您的数据访问层提供 consistent exception hierarchy,从而大大简化此任务。

    或者,当您无法防止事务失败时,您必须抛出上下文异常,尽可能详细地说明问题所在。理想情况下,您应该使用日志记录,以便以后确定发生了什么。

    例如,在部门服务层中:

    @Autowire
    DepartmentDao deptDao;
    
    @Transactional(readOnly = true)
    public Department getDepartment(Integer id) {
      try {
         return deptDao.findDepartmentById(id);
      } catch(RuntimeException rte) {
        throw new ServiceOperationException("Failed to retrieve department " + id, rte); 
      }
    }
    

    这样,异常将有更多的上下文原因导致失败,异常堆栈跟踪将包含返回到实际失败位置的所有跟踪,但跟踪中的第一个异常始终指向代码中的位置您的交易失败。

    在控制器层,Spring 具有允许您定义your own exception handlers 的功能。这样,您可以决定在您的上下文异常发生时返回给客户端的内容。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2011-07-20
      • 2012-06-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2021-04-22
      相关资源
      最近更新 更多