Linkis 中间件 不同数据源比如mysql和orcale怎么自动实现分库分表用springboot框架写一个查询数据的demo
时间: 2023-07-15 21:14:42 浏览: 194
springboot+mybat(多数据源) 通过aop实现分库的操作 ,通过传入的动态表明实现分表查询
实现分库分表的方式有多种,其中比较常见的是垂直分库和水平分库。垂直分库是指将不同的数据库表分配到不同的数据库中,比如将用户相关的表放在一台数据库中,订单相关的表放在另一台数据库中。水平分库是指将同一个表的不同数据行分布到不同的数据库中,比如按照用户 ID 进行分片存储。
在使用 Linkis 中间件进行多数据源操作时,可以通过配置多个数据源实现分库分表。以下是一个使用 Spring Boot 框架实现查询数据的 Demo,其中使用了两个数据源分别连接 MySQL 和 Oracle 数据库,并实现了水平分片。
首先在 pom.xml 文件中添加 Linkis 中间件和 MySQL、Oracle 驱动的依赖:
```xml
<dependencies>
<dependency>
<groupId>com.webank.wedatasphere.linkis</groupId>
<artifactId>linkis-client</artifactId>
<version>0.11.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>19.3.0.0</version>
</dependency>
</dependencies>
```
然后在 application.properties 文件中配置 MySQL 和 Oracle 数据库的连接信息:
```properties
# MySQL 数据库配置
mysql.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mysql.datasource.url=jdbc:mysql://localhost:3306/test_db?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
mysql.datasource.username=root
mysql.datasource.password=root
# Oracle 数据库配置
oracle.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
oracle.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCLCDB
oracle.datasource.username=system
oracle.datasource.password=root
```
接着在代码中定义两个数据源的配置和数据源对象:
```java
@Configuration
public class DataSourceConfig {
@Bean(name = "mysqlDataSource")
@ConfigurationProperties(prefix = "mysql.datasource")
public DataSource mysqlDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "oracleDataSource")
@ConfigurationProperties(prefix = "oracle.datasource")
public DataSource oracleDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSource")
@Primary
public DataSource dataSource(@Qualifier("mysqlDataSource") DataSource mysqlDataSource,
@Qualifier("oracleDataSource") DataSource oracleDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("mysql", mysqlDataSource);
targetDataSources.put("oracle", oracleDataSource);
RoutingDataSource dataSource = new RoutingDataSource();
dataSource.setTargetDataSources(targetDataSources);
dataSource.setDefaultTargetDataSource(mysqlDataSource);
return dataSource;
}
}
```
其中,`mysqlDataSource` 和 `oracleDataSource` 方法分别返回 MySQL 和 Oracle 数据库的数据源对象,`dataSource` 方法定义了一个路由数据源对象,并将 MySQL 数据源作为默认数据源,将所有数据源放入 `targetDataSources` 中。
接着定义一个 `RoutingDataSource` 类,用于根据分片键路由到不同的数据源:
```java
public class RoutingDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
String shardKey = ShardContextHolder.getShardKey();
if (StringUtils.isEmpty(shardKey)) {
return "mysql";
} else {
return shardKey;
}
}
}
```
其中,`determineCurrentLookupKey` 方法根据分片键获取当前需要使用的数据源的名称,如果分片键为空,则使用默认数据源(MySQL 数据源)。
最后,定义一个 Controller 类,用于查询数据:
```java
@RestController
public class DemoController {
@Autowired
private JdbcTemplate jdbcTemplate;
@GetMapping("/test")
public String test() {
ShardContextHolder.setShardKey("mysql_1");
List<Map<String, Object>> result1 = jdbcTemplate.queryForList("SELECT * FROM user");
ShardContextHolder.setShardKey("oracle_1");
List<Map<String, Object>> result2 = jdbcTemplate.queryForList("SELECT * FROM order");
return "result1: " + result1 + "\nresult2: " + result2;
}
}
```
其中,`test` 方法先设置分片键为 `mysql_1`,然后从 `user` 表中查询数据;接着设置分片键为 `oracle_1`,从 `order` 表中查询数据。`ShardContextHolder` 类是一个自定义的上下文类,用于存储当前分片键。
启动应用程序后,访问 `/test` 接口可以看到查询结果。这里假设 `user` 表和 `order` 表已经分别存储在 MySQL 和 Oracle 数据库中,并且已经按照分片键进行了水平分片。
需要注意的是,这只是一个简单的示例,实际的分库分表场景会更加复杂,需要根据具体业务需求进行设计和实现。
阅读全文