IDEA配置多数据源(MySQL和clickhouse)

        在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服务已启动

成功获取数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值