Как поймать сломанное соединение с базой данных - PullRequest
0 голосов
/ 30 апреля 2018

Я работаю над приложением, которое извлекает и вводит информацию в базу данных, используя шаблон Spring JDBC. На уровне сервиса я хотел бы установить некоторую логику для перехвата исключения, если база данных выйдет из строя. Тем не менее, я понятия не имею, как это сделать. Я могу настроить методы для перехвата, если они потерпят неудачу, но я бы хотел настроить определенную логику для сервера, который выходит из строя.

1 Ответ

0 голосов
/ 01 мая 2018

Как вариант - вы можете создать планировщик, который будет проверять соединение с базой данных.

Связь с базой данных можно проверить, выполнив простой запрос или через Соединение интерфейс:

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);
    }
}

Это общий обзор и всего несколько советов для дальнейших исследований.

Только одно замечание: если сервер отключается, вам нужно аварийное восстановление, перехват исключения не поможет. Это большая инфраструктурная и архитектурная задача, а не ответственность одного приложения.

...