1.配置文件
spring:
application:
name: shardjdbctest
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://114.115.248.108:3307/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
password: 1qaz2wsx
username: root
driver-class-name: com.mysql.jdbc.Driver
shardingsphere:
datasource:
names: write-ds,read-ds,read-ds1,read-ds2
write-ds:
jdbc-url: jdbc:mysql://120.48.73.195:3306/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 1qaz2wsx
read-ds:
jdbc-url: jdbc:mysql://120.48.73.195:3307/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 1qaz2wsx
read-ds1:
jdbc-url: jdbc:mysql://114.115.248.108:3306/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 1qaz2wsx
read-ds2:
jdbc-url: jdbc:mysql://114.115.248.108:3307/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 1qaz2wsx
# masterslave:
# master-data-source-name: write-ds
# slave-data-source-names: read-ds,read-ds1
# load-balance-algorithm-type: round_robin
props:
sql:
show: true
sharding:
master-slave-rules:
mm1:
master-data-source-name: write-ds
slave-data-source-names: read-ds,read-ds1
load-balance-algorithm-type: round_robin
mm2:
master-data-source-name: read-ds
slave-data-source-names: read-ds,read-ds2
load-balance-algorithm-type: round_robin
server:
port: 8080
2.代码配置
@Configuration
@MapperScan(basePackages = {"com.example.shardjdbctest.mapper"}, sqlSessionFactoryRef = "shardingSqlSessionFactory")
//@AutoConfigureAfter(SpringBootConfiguration.class)
public class Dbconfig {
@Bean(name = "shardingTransactionManager")
public DataSourceTransactionManager shardingTransactionManager(@Qualifier("shardingDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "shardingSqlSessionFactory")
public SqlSessionFactory shardingSqlSessionFactory(@Qualifier("shardingDataSource") DataSource dataSource)
throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean ();
sessionFactory.setDataSource(dataSource);
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
}
@Configuration
@MapperScan(basePackages = {"com.example.shardjdbctest.othermapper"} , sqlSessionFactoryRef = "otherSqlSessionFactory")
public class OtherDbConfig {
@SuppressWarnings("unchecked")
protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {
return (T) properties.initializeDataSourceBuilder().type(type).build();
}
@Bean("otherDataSource")
@ConfigurationProperties(prefix = "spring.datasource.hikari")
DataSource otherDataSource(DataSourceProperties properties) {
HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
@Bean(name = "otherTransactionManager")
@Primary
public DataSourceTransactionManager otherTransactionManager(@Qualifier("otherDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "otherSqlSessionFactory")
public SqlSessionFactory otherSqlSessionFactory(@Qualifier("otherDataSource") DataSource dataSource)
throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
// SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
// sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
// .getResources(ClusterDbConfig.MAPPER_LOCATION));
// sessionFactory.setTypeAliasesPackage(DOMAIN_PACKAGE);
//mybatis 数据库字段与实体类属性驼峰映射配置
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
}
@RequestMapping("/test21")
@Transactional(rollbackFor = Exception.class, transactionManager = "otherTransactionManager")
public String test21(Integer id) {
LambdaQueryWrapper<Student> eq = new LambdaQueryWrapper<Student>().eq(Student::getId, id);
Student s = new Student();
s.setName(UUID.randomUUID().toString().replace("-", ""));
int update = otherStudentMapper.update(s, eq);
if (id == 8) {
throw new RuntimeException();
}
return update > 0 ? "success" : "fail";
}
3.注意
(1)、sharding-jdbc 实在数据源的层面上实现的读写分离和分库分表,对用的数据源实现类为 org.apache.shardingsphere.shardingjdbc.jdbc.core.datasource.ShardingDataSource
(2)、如下的地方会全部参与轮询
(3),代码地址
https://download.youkuaiyun.com/download/qq_23412557/86752828