在springboot开发中,我们常常需要同时访问多个数据库,比如用MySQL存储业务数据,用ClickHouse做分析查询。如何在Spring Boot项目中配置多数据源?本文详细介绍在IDEA中如何集成MySQL和ClickHouse,并提供完整代码示例。
1.准备好MySQL数据库和clickhouse数据库,在pom.xml中导入依赖:
<!-- clickHouse数据库 -->
<dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.1.53</version>
</dependency>
<!-- mysql数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>
2.在项目的application.yml文件中添加数据库配置:
# MySQL 数据源配置,jdbc-url改成你的mysql数据库url
db1:
jdbc-url: jdbc:mysql://localhost:3306/houserent
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
# ClickHouse 数据源配置,jdbc-url改成你的clickhouse数据库url
db2:
jdbc-url: jdbc:clickhouse://node1:8123/houserent
username: default
password: 123456
driver-class-name: ru.yandex.clickhouse.ClickHouseDriver
clickhouse的登录用户必须有密码,可以创建新的账户,也可以给default用户添加密码(defalt用户默认没有密码)。若要给default用户设置密码,则要修改clickhouse-server目录下的users.xml文件:

在<password></password>中添加密码。
3.在config下创建多数据源配置文件DataSourceConfig:

DataSourceConfig内容:
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.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = "com.houserent.mapper.mysql", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
@MapperScan(basePackages = "com.houserent.mapper.clickhouse", sqlSessionFactoryRef = "clickhouseSqlSessionFactory")
public class DataSourceConfig {
// MySQL 数据源
@Bean(name = "mysqlDataSource")
@Primary
@ConfigurationProperties(prefix = "db1")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
// ClickHouse 数据源
@Bean(name = "clickhouseDataSource")
@ConfigurationProperties(prefix = "db2")
public DataSource clickhouseDataSource() {
return DataSourceBuilder.create().build();
}
// MySQL SqlSessionFactory
@Bean(name = "mysqlSqlSessionFactory")
@Primary
public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 获取 MyBatis 的默认配置
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true); // 启用驼峰命名转换
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
// ClickHouse SqlSessionFactory
@Bean(name = "clickhouseSqlSessionFactory")
public SqlSessionFactory clickhouseSqlSessionFactory(@Qualifier("clickhouseDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// 获取 MyBatis 的默认配置
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true); // 启用驼峰命名转换
configuration.setCacheEnabled(false); // 禁用 ClickHouse 数据源的缓存
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
// MySQL 事务管理器
@Bean(name = "mysqlTransactionManager")
@Primary
public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
// ClickHouse 事务管理器
@Bean(name = "clickhouseTransactionManager")
public PlatformTransactionManager clickhouseTransactionManager(@Qualifier("clickhouseDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
注意点:
①项目mapper中处理MySQL的接口和处理clickhouse的接口要分开(如分别存入clickhouse和mysql目录下):

②DataSourceConfig中的"db1"和"db2"要与application.yml中的配置名称保持一致
③配置多数据源后,application.yml中配置的驼峰命名会失效,要在DataSourceConfig中开启驼峰命名转换。
4.结果展示:
确保clickhouse服务已启动


成功获取数据。
1060

被折叠的 条评论
为什么被折叠?



