This guide shows how to combine ClickHouse, TimescaleDB, and PostgreSQL in a Spring Boot app for hybrid analytics.
1. Configure Multiple DataSources
In
application.yml:
spring:
datasource:
clickhouse:
url: jdbc:clickhouse://localhost:8123/default
driver-class-name: com.clickhouse.jdbc.ClickHouseDriver
timescale:
url: jdbc:postgresql://localhost:5432/timescale
driver-class-name: org.postgresql.Driver
postgres:
url: jdbc:postgresql://localhost:5432/postgres
driver-class-name: org.postgresql.Driver
2. Define Configurations
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.clickhouse")
public DataSource clickHouseDataSource() { return DataSourceBuilder.create().build(); }
@Bean
@ConfigurationProperties("spring.datasource.timescale")
public DataSource timescaleDataSource() { return DataSourceBuilder.create().build(); }
@Bean
@ConfigurationProperties("spring.datasource.postgres")
public DataSource postgresDataSource() { return DataSourceBuilder.create().build(); }
}
3. Query Each Database
@Autowired JdbcTemplate clickhouseJdbc;
@Autowired JdbcTemplate timescaleJdbc;
@Autowired JdbcTemplate postgresJdbc;
Fetch data from each:
List<Map<String, Object>> metrics = clickhouseJdbc.queryForList("SELECT * FROM events LIMIT 10");
List<Map<String, Object>> series = timescaleJdbc.queryForList("SELECT * FROM metrics LIMIT 10");
List<Map<String, Object>> users = postgresJdbc.queryForList("SELECT * FROM users LIMIT 10");
4. Combine Results
Merge results into one DTO for hybrid analytics:
public record HybridReport(Object events, Object series, Object users) {}
Return them through a REST endpoint.
5. Expose Hybrid Analytics API
@RestController
@RequestMapping("/analytics")
public class AnalyticsController {
@GetMapping("/hybrid")
public HybridReport getHybrid() {
return new HybridReport(metrics, series, users);
}
}
image quote pre code