Как вариант - вы можете создать планировщик, который будет проверять соединение с базой данных.
Связь с базой данных можно проверить, выполнив простой запрос или через Соединение интерфейс:
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);
}
}
Это общий обзор и всего несколько советов для дальнейших исследований.
Только одно замечание: если сервер отключается, вам нужно аварийное восстановление, перехват исключения не поможет. Это большая инфраструктурная и архитектурная задача, а не ответственность одного приложения.