我正在使用Spring JDBC模板处理从数据库中检索信息并将信息输入到数据库的应用程序。在服务层,我想设置一些逻辑来捕获异常,如果数据库出现故障。但是,我不知道该怎么做。我能够设置方法来捕获它们是否失败,但我想为服务器设置特定的逻辑。
答案 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);
}
}
这是一个概述,只是进一步研究的几个提示。
请注意,如果服务器出现故障,您需要进行灾难恢复,捕获异常将无济于事。这是一项重大的基础架构和架构任务,而不是单一应用程序的责任。