springboot mysql clickhouse双数据源配置
时间: 2025-05-17 14:21:45 浏览: 18
### Spring Boot 双数据源配置 (MySQL 和 ClickHouse)
在 Spring Boot 中配置双数据源(MySQL 和 ClickHouse),可以通过定义多个 `DataSource` 实现,并结合 MyBatis 或其他 ORM 工具完成动态切换。以下是具体方法:
#### 1. 添加 Maven 依赖
为了支持 MySQL 和 ClickHouse 数据源,需引入对应的 JDBC 驱动以及必要的 Starter。
```xml
<!-- 导入Spring Boot JDBC场景启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- ClickHouse驱动 -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>
<!-- MyBatis Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
```
以上依赖涵盖了 MySQL 和 ClickHouse 的连接需求,同时也集成了 MyBatis 支持[^1]。
---
#### 2. 配置 application.yml 文件
通过 YAML 文件分别指定两个数据源的连接信息。
```yaml
spring:
datasource:
mysql:
url: jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
clickhouse:
url: jdbc:clickhouse://localhost:8123/clickhouse_db
username: default
password:
driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
```
上述配置明确了 MySQL 和 ClickHouse 的 URL、用户名、密码及驱动类名[^3]。
---
#### 3. 定义多数据源 Bean
创建 Java 配置类来注册两个独立的数据源及其事务管理器。
```java
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.example.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlConfig {
@Bean(name = "mysqlDataSource")
public DataSource dataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mysql_db");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean(name = "mysqlSqlSessionFactory")
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/mysql/*.xml"));
return sessionFactory.getObject();
}
}
```
同理,可以为 ClickHouse 创建类似的配置类 `ClickhouseConfig.java`,只需调整包路径和 Mapper 扫描范围即可[^4]。
---
#### 4. 动态数据源切换机制
如果需要在同一业务逻辑中灵活切换数据源,则可通过自定义注解或 AOP 切面实现动态切换功能。
```java
// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface TargetDataSource {
String name(); // 数据源名称
}
// 动态数据源上下文持有者
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSource(String dsName) {
CONTEXT_HOLDER.set(dsName);
}
public static String getDataSource() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSource() {
CONTEXT_HOLDER.remove();
}
}
```
最后,在全局数据源代理中加入判断逻辑,基于当前线程绑定的目标数据源执行查询操作[^2]。
---
#### 5. 测试与验证
编写单元测试案例,模拟不同场景下的 SQL 查询行为,确保两套数据源均能正常工作。
```java
@SpringBootTest
class DualDatasourceApplicationTests {
@Autowired
@Qualifier("mysqlDataSource")
private DataSource mysqlDataSource;
@Test
void testMysqlConnection() throws SQLException {
try (Connection conn = mysqlDataSource.getConnection()) {
System.out.println(conn.getCatalog());
}
}
}
```
---
###
阅读全文
相关推荐


















