0
点赞
收藏
分享

微信扫一扫

springboot clickhouse mysql 双数据源

小北的爹 2024-06-15 阅读 9

实现springboot clickhouse mysql双数据源

一、整体流程

首先,我们需要在Spring Boot项目中配置两个数据源,一个是clickhouse,另一个是mysql,然后通过JPA实现对这两个数据源的操作。

以下是实现双数据源的步骤表格:

步骤 操作
1 添加依赖
2 配置application.properties文件
3 创建clickhouse数据源配置类
4 创建mysql数据源配置类
5 创建实体类和Repository
6 编写Service和Controller
7 测试双数据源操作

二、详细步骤

1. 添加依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
    <groupId>ru.yandex.clickhouse</groupId>
    <artifactId>clickhouse-jdbc</artifactId>
</dependency>

2. 配置application.properties文件

在application.properties文件中配置clickhouse和mysql的数据源信息:

# clickhouse数据源配置
spring.datasource.clickhouse.driver-class-name=ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.clickhouse.url=jdbc:clickhouse://localhost:8123/default
spring.datasource.clickhouse.username=
spring.datasource.clickhouse.password=

# mysql数据源配置
spring.datasource.mysql.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.mysql.url=jdbc:mysql://localhost:3306/test
spring.datasource.mysql.username=root
spring.datasource.mysql.password=root

3. 创建clickhouse数据源配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.clickhouse.repository",
        entityManagerFactoryRef = "clickhouseEntityManagerFactory",
        transactionManagerRef = "clickhouseTransactionManager"
)
public class ClickhouseDataSourceConfig {
    
    @Primary
    @Bean(name = "clickhouseDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.clickhouse")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Primary
    @Bean(name = "clickhouseEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("clickhouseDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.clickhouse.entity")
                .persistenceUnit("clickhouse")
                .build();
    }
    
    @Primary
    @Bean(name = "clickhouseTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("clickhouseEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

4. 创建mysql数据源配置类

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.mysql.repository",
        entityManagerFactoryRef = "mysqlEntityManagerFactory",
        transactionManagerRef = "mysqlTransactionManager"
)
public class MysqlDataSourceConfig {
    
    @Bean(name = "mysqlDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.mysql")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }
    
    @Bean(name = "mysqlEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("mysqlDataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.mysql.entity")
                .persistenceUnit("mysql")
                .build();
    }
    
    @Bean(name = "mysqlTransactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("mysqlEntityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

5. 创建实体类和Repository

分别创建clickhouse和mysql的实体类和Repository接口,可以参考以下示例:

// Clickhouse Entity
@Entity
@Table(name = "clickhouse_table")
public class ClickhouseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // getter and setter
}

// Clickhouse Repository
public interface ClickhouseRepository extends JpaRepository<ClickhouseEntity, Long> {
}

// Mysql Entity
@Entity
@Table(name = "mysql_table")
public class MysqlEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // getter and setter
}

// Mysql Repository
public interface MysqlRepository extends JpaRepository<MysqlEntity, Long> {
}

6. 编写Service和Controller

编写Service和Controller对clickhouse和mysql进行操作,可以参考以下示例:

// Clickhouse Service
@Service
public class ClickhouseService {
    
    @Autowired
    private Click
举报

相关推荐

0 条评论