关于Java中ShardingSphere分库分表的实战攻略,我将从以下几个方面进行讲解:
- 简介:什么是ShardingSphere分库分表
- 分库分表实战攻略:分库分表的具体实现步骤
- 示例1:如何使用ShardingSphere进行分库分表
- 示例2:如何根据业务自定义Sharding规则
1. 简介
ShardingSphere是一款非常流行的数据库分库分表中间件,它可以适用于各种主流的关系型数据库,包括MySQL、PostgreSQL、SQL Server等等。ShardingSphere通过对数据库的路由规则进行自定义,将数据切分成多个部分存储在不同的数据库以及表中,从而实现读写分离等一系列操作。
2. 分库分表实战攻略
下面是ShardingSphere分库分表的具体实现步骤:
- 引入ShardingSphere依赖
在pom.xml文件中,我们需要引入ShardingSphere的相关依赖,包括sharding-jdbc-core、sharding-jdbc-spring-boot-starter等等。
- 配置ShardingSphere规则
在application.yml文件中,我们需要配置ShardingSphere的分库分表规则,包括数据源配置、分库分表策略等等。
- 编写数据源
我们需要根据配置文件中的数据源信息,来创建对应的数据源类。
- 编写DAO层代码
在DAO层中,我们需要使用Spring JdbcTemplate来访问数据库,这样可以保证我们在ShardingSphere过程中的数据访问方式与传统方式一致。
3. 示例1
下面是一个使用ShardingSphere进行分库分表的示例:
- 引入依赖
首先,在pom.xml文件中添加如下依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>${shardingsphere.version}</version>
</dependency>
其中,${shardingsphere.version}表示ShardingSphere版本号。
- 配置数据源
在application.yml文件中配置如下数据源:
spring:
shards:
# 主库1配置
-
dataSources:
ds_master:
url: jdbc:mysql://localhost:3306/db0?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
tableRules:
- !SHARDING_TABLE_LOGIC_NAME
actualDataNodes: ds_master.tb_order_${0..1}
tableStrategy:
# 分表策略配置
inline:
# 分表列,这里以id为例
shardingColumn: id
# 分表算法
algorithmExpression: tb_order_${id % 2}
# 数据源名称
dataSourceNames:
- ds_master
# 主库2配置
-
dataSources:
ds_slave:
url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
tableRules:
- !SHARDING_TABLE_LOGIC_NAME
actualDataNodes: ds_slave.tb_order_${0..1}
tableStrategy:
inline:
shardingColumn: id
algorithmExpression: tb_order_${id % 2}
dataSourceNames:
- ds_slave
# sharding jdbc 配置
sharding.jdbc:
config:
# 分库分表规则配置文件路径
shardingConfigFile: shardingsphere.yaml
- 编写DAO层
在DAO层中,我们需要使用Spring JdbcTemplate来访问数据库,代码示例如下:
@Repository
public class OrderDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Order> listOrders() {
return jdbcTemplate.query("SELECT * FROM tb_order", BeanPropertyRowMapper.newInstance(Order.class));
}
public Order queryOrderById(int id) {
String sql = "SELECT * FROM tb_order WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, BeanPropertyRowMapper.newInstance(Order.class));
}
public int addOrder(Order order) {
GeneratedKeyHolder holder = new GeneratedKeyHolder();
jdbcTemplate.update(con -> {
PreparedStatement ps = con.prepareStatement("INSERT INTO tb_order (user_id, remark, amount) VALUES (?, ?, ?)", Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, order.getUserId());
ps.setString(2, order.getRemark());
ps.setDouble(3, order.getAmount());
return ps;
}, holder);
return holder.getKey().intValue();
}
}
以上示例就是一个基于ShardingSphere实现的分库分表的示例。
4. 示例2
除此之外,我们还可以根据业务需求自定义Sharding规则,以下是一个根据一定规则自定义的分库分表Sharding规则:
- 自定义分库规则和分表规则
public class ModuloShardingDatabaseStrategy implements ShardingAlgorithm {
private static final int DEFAULT_MODULO = 4;
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
Collection<String> result = new HashSet<>(DEFAULT_MODULO);
for (Object each : shardingValue.getValues()) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(String.format("_%02d", (((Long)each) % DEFAULT_MODULO)))){
result.add(tableName);
}
}
}
return result;
}
}
public class ModuloShardingTableStrategy implements ShardingAlgorithm {
private static final int DEFAULT_MODULO = 4;
@Override
public Collection<String> doSharding(Collection<String> availableTargetNames, ShardingValue shardingValue) {
Collection<String> result = new HashSet<>(DEFAULT_MODULO);
for (Object each : shardingValue.getValues()) {
for (String tableName : availableTargetNames) {
if (tableName.endsWith(String.format("_%02d", (((Long)each) % DEFAULT_MODULO)))){
result.add(tableName);
}
}
}
return result;
}
}
- 数据源和表的配置
spring:
datasource:
driverClassName: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/mytest?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
sharding:
databases:
names: ds_${0..3}
ds_0:
dsN_0:
url: jdbc:mysql://localhost:3306/db_0?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
dsN_1:
url: jdbc:mysql://localhost:3306/db_1?useSSL=false&serverTimezone=UTC&characterEncoding=utf-8
username: root
password: root
props:
sql.show: true
tables:
tb_order_0:
logicTable: tb_order
actualDataNodes: ds_${0..3}.tb_order_${0..3}
tableStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_table_inline
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_database_inline
tb_order_1:
logicTable: tb_order
actualDataNodes: ds_${0..3}.tb_order_${0..3}
tableStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_table_inline
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_database_inline
tb_order_2:
logicTable: tb_order
actualDataNodes: ds_${0..3}.tb_order_${0..3}
tableStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_table_inline
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_database_inline
tb_order_3:
logicTable: tb_order
actualDataNodes: ds_${0..3}.tb_order_${0..3}
tableStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_table_inline
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_database_inline
sharding.jdbc.config.shardingRuleConfiguration.overrides:
- sqlShardingRule:
automatic: false
tables:
tb_order:
databaseStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_database_inline
tableStrategy:
inline:
shardingColumn: id
shardingAlgorithmName: tb_order_table_inline
bindingTables:
- tb_order
以上是针对ShardingSphere分库分表的实战攻略和2个示例讲解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中ShardingSphere分库分表实战 - Python技术站