实现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