Когда я использую CompletableFuture для проверки соединения с базой данных, вызов класса DAO никогда не происходит. Тема никогда не завершается.
Когда я пытаюсь сделать то же самое в главном потоке с прямым вызовом DAO в классе, он работает просто отлично
Ниже код никогда не завершает звонок
CompletableFuture.supplyAsync(() -> {
try {
LOG.info("Testing My DB Connection");
return this.myDBDao.testConnection();
} catch(SQLException sqlE) {
return false;
}
}, this.asyncExecutor).thenAccept(val -> {
if(val) {
LOG.info("My DB Connection Test SUCCESS");
} else {
throw new RuntimeException("CONNECTION TO MY DB FAILED");
}
}).join();
Ниже код работает просто отлично
try {
if(this.myDBDao.testConnection()) {
LOG.info("Testing My DB Connection");
} else {
throw new RuntimeException("CONNECTION TO MY DB FAILED");
}
} catch(SQLException sqlE) {
throw new RuntimeException("CONNECTION TO MY DB FAILED");
}
Метод DAO
private static final String TEST_CON_QUERY = "select 'TRUE' as val from dual";
public boolean testConnection() throws SQLException {
LOG.info("testConnection from DAO: " + this.jdbcTemplate.getDataSource());
return this.jdbcTemplate.query(TEST_CON_QUERY, (rs) -> {
return (rs.next()) ? rs.getBoolean("VAL") : false;
});
}
Источник данных и пул соединений
@Bean(name = "myDBTemplate")
JdbcTemplate myJDBCTemplate() throws SQLException {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(******);
config.setUsername(******);
config.setPassword(******);
config.setMaximumPoolSize(50);
config.setMinimumIdle(10);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setPoolName("myDBPool");
return new JdbcTemplate(new HikariDataSource(config));
}
Палач
@Bean(name = "asyncExecutor")
public ExecutorService getAsyncExecutor() {
return Executors.newCachedThreadPool();
}
Почему код внутри CompletableFuture никогда не может вызвать метод testConnection ()?