1.导入sharding-JDBC依赖
我这里用的是最新版本
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2.配置文件中配置相关属性
spring:
shardingsphere:
datasource:
names: master,slave
master:
# type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.23.128:3306/user
username: root
password: 888888
slave:
# type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.23.128:3306/user
username: root
password: 888888
masterslave:
# 读写分离配置
# 配置从库执行策略 为轮询 例如我们有 1 2 3 号 3个从库 第一次执行1号库 第二次执行2号库 以此类推轮着来
load-balance-algorithm-type: round_robin
# 最终数据源名称
name: dataSource
# 主库数据源名称 对应上面的主从库数据源
master-data-source-name: master
slave-data-source-names: slave
# 打印sql
props:
sql:
show: true
我在测试的时候使用不了配置文件 一配置这些东西就会报错
如下图 在配置主从库数据源的时候报错
所以我使用了配置类的方式来进行配置, 我不知道这样配置是不是正确的, 但确实可以运行出相同的效果, 欢迎大家指正
@Configuration
public class ShardingsphereConfig {
public DataSource hikariDataSource (String username,String pwd,String className,String url){
HikariDataSource hikariDataSource1=new HikariDataSource();
hikariDataSource1.setUsername(username);
hikariDataSource1.setPassword(pwd);
hikariDataSource1.setDriverClassName(className);
hikariDataSource1.setJdbcUrl(url);
return hikariDataSource1;
}
@Bean
public ShardingRuleConfiguration shardingRuleConfiguration(){
ShardingRuleConfiguration config=new ShardingRuleConfiguration();
LoadBalanceStrategyConfiguration loadConfiguration=new LoadBalanceStrategyConfiguration("round_robin");
MasterSlaveRuleConfiguration configuration=new MasterSlaveRuleConfiguration("dataSource",
"master",List.of("slave"),
loadConfiguration
);
config.setMasterSlaveRuleConfigs(List.of(configuration));
return config;
}
@Bean
public DataSource shardingDataSource(ShardingRuleConfiguration configuration){
DataSource masterDataSource = hikariDataSource("root", "888888", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://192.168.xx.xxx:3306/user");
DataSource slaveDataSource = hikariDataSource("root", "888888", "com.mysql.cj.jdbc.Driver", "jdbc:mysql://192.168.xx.xxx:3306/user");
Map<String, DataSource> dataSourceMap=new HashMap<>();
dataSourceMap.put("master",masterDataSource);
dataSourceMap.put("slave",slaveDataSource);
DataSource shardingDataSource= null;
Properties props=new Properties();
props.put("sql.show",true);
try {
shardingDataSource=ShardingDataSourceFactory.createDataSource(dataSourceMap,configuration,props);
} catch (SQLException e) {
throw new RuntimeException(e);
}
return shardingDataSource;
}
}
测试类
@SpringBootTest
class SpringbootShardingJdbcApplicationTests {
@Autowired
DataSource dataSource; (可以不用注入此 注入进来使用debug可以观看数据源是否配置了主从表,如果有这个数据源 跟平常的数据源是不一样的 我是配置了两个数据源 这里面就装有两个数据源)
@Autowired
private UserTestMapper userMapper;
@Test
void contextLoads() {
// userMapper.insert(new UserTest("小黄22"));
List<UserTest> users = userMapper.selectList(null);
System.out.println(users);
}
@Test
void contextLoads2() {
userMapper.insert(new UserTest("小黄556"));
}
}
执行添加操作 可以看打印的日志内容, 使用的主库进行添加操作
执行查询操作 可以看出是用从库来进行查询操作