如何捕获损坏的数据库连接

时间:2018-04-30 18:25:55

标签: java try-catch spring-jdbc jdbctemplate

我正在使用Spring JDBC模板处理从数据库中检索信息并将信息输入到数据库的应用程序。在服务层,我想设置一些逻辑来捕获异常,如果数据库出现故障。但是,我不知道该怎么做。我能够设置方法来捕获它们是否失败,但我想为服务器设置特定的逻辑。

1 个答案:

答案 0 :(得分:1)

作为选项 - 您可以创建一个用于检查数据库连接的sceduler。

可以通过执行简单查询或通过Connection接口检查数据库连接:

boolean isValid(int timeout) throws SQLException
  

如果连接尚未关闭且仍然有效,则返回true。   驱动程序应提交有关连接的查询或使用其他一些查询   积极验证连接的机制仍然有效   这个方法叫做。驱动程序提交的查询以进行验证   连接应在当前环境中执行   事务。

通过Spring调度程序检查数据库连接的示例:

@Service
public class ConnectionListener {

    private Connection connection;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @PostConstruct
    public void init() {
         connection = jdbcTemplate.getDatasource().getConnection();
    }

    @Scheduled(fixedRate = 60000) // check every 60 sec
    public void checkConnection() {
        try {
            connection.isValid(10);
        } catch (SQLException e) { // Or just handle it here
            throw new ConnectionTimeoutException(e);
        }
    }
}

您需要一些额外的配置来处理从Spring Scheduler抛出的异常:

@EnableScheduling
@Configuration
class SchedulingConfiguration implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(...);
    }
}

Sceduler也可以用ExecutorService实现。

@Service
class ConnectionLisener {

    private ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
    private Connection connection;

    @PostConstruct
    public void init() {
        connection = jdbcTemplate.getDatasource().getConnection();
        checkConnection();
    }

    @PreDestroy
    public void destroy() {
        service.shutdown();
    }

    public void checkConnection() {
        service.scheduleAtFixedRate(() -> {
            try {
                connection.isValid(10);
            } catch (Exception e) { 
                // handle your exception
            }
        }, 60, 60, TimeUnit.SECONDS);
    }
}

这是一个概述,只是进一步研究的几个提示。

请注意,如果服务器出现故障,您需要进行灾难恢复,捕获异常将无济于事。这是一项重大的基础架构和架构任务,而不是单一应用程序的责任。