使用 Sharding-JDBC 实现水平分库+水平分表的步骤如下:
1. 创建共享库(shared database)的配置文件
定义数据库名称以及访问方式,如 JDBC URL,数据源等,同时还需要指定共享库所要分片策略和插件配置。
示例代码如下:
# shardingsphere datasource config
spring:
sharding:
datasource:
# 共享库配置
names: ds_shared
ds_shared:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/shared?useSSL=false
username: root
password: root
# 共享库分片
sharding:
tables:
shared_order:
# 分片算法
actual-data-nodes:
ds_shared.shared_order_$->{1..2}
# 表分片键
table-strategy:
inline:
sharding-key: order_id
algorithm-expression: shared_order_$->{order_id % 2 + 1}
# 数据分片键
database-strategy:
inline:
sharding-key: user_id
algorithm-expression: ds$->{user_id % 2 + 1}
# 标准规则
default-database-strategy:
inline:
sharding-column: user_id
algorithm-expression: ds$->{user_id % 2 + 1}
default-table-strategy:
inline:
sharding-column: order_id
algorithm-expression: shared_order_$->{order_id % 2 + 1}
2. 创建分片库的配置文件
类似共享库的配置方式,只是需要指定分片库的配置信息,包括数据源,分片键等。
示例代码如下:
# shardingsphere datasource config
spring:
sharding:
datasource:
# 分片库1配置
names: ds1
ds1:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds_0?useSSL=false
username: root
password: root
# 分片库2配置
ds2:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
jdbc-url: jdbc:mysql://localhost:3306/ds_1?useSSL=false
username: root
password: root
# 分片库分片
sharding:
tables:
order_item:
# 分片算法
actual-data-nodes:
ds$->{1..2}.order_item_$->{1..2}
# 表分片键
table-strategy:
inline:
sharding-key: order_id
algorithm-expression: order_item_$->{order_id % 2 + 1}
# 数据分片键
database-strategy:
inline:
sharding-key: user_id
algorithm-expression: ds$->{user_id % 2 + 1}
# 标准规则
default-database-strategy:
inline:
sharding-column: user_id
algorithm-expression: ds$->{user_id % 2 + 1}
default-table-strategy:
none: ''
3. 创建实体类
定义数据库表与对象属性的映射关系,如表名、字段名、数据类型等。
示例代码如下:
@Data
public class OrderItem {
private Long id;
private Long orderId;
private Integer userId;
private String status;
}
4. 创建Mapper映射器
创建数据操作的接口,并通过 @Mapper 注解标记为一个 Mapper,同时需要定义SQL语句以及参数的映射关系。
示例代码如下:
@Mapper
public interface OrderItemMapper {
@Insert("INSERT INTO order_item (order_id, user_id, status)" +
"VALUES (#{orderId}, #{userId}, #{status})")
void insert(OrderItem orderItem);
@Select("SELECT * FROM order_item WHERE order_id = #{orderId}")
List<OrderItem> selectByOrderId(@Param("orderId") Long orderId);
}
5. 创建服务类
定义应用程序中的服务功能,并注入 Mapper 对象用于操作数据。
示例代码如下:
@Service
public class OrderItemService {
@Autowired
private OrderItemMapper orderItemMapper;
public void insert(OrderItem orderItem) {
orderItemMapper.insert(orderItem);
}
public List<OrderItem> selectByOrderId(Long orderId) {
return orderItemMapper.selectByOrderId(orderId);
}
}
以上就是使用 Sharding-JDBC 实现水平分库+水平分表的完整攻略。下面提供两个示例代码:
- 示例1:使用Sharding-JDBC实现水平分库+水平分表
// 分别向每个分片库中插入数据
OrderItem orderItem1 = new OrderItem();
orderItem1.setOrderId(1L);
orderItem1.setUserId(1);
orderItem1.setStatus("Payed");
orderItemService.insert(orderItem1);
OrderItem orderItem2 = new OrderItem();
orderItem2.setOrderId(2L);
orderItem2.setUserId(2);
orderItem2.setStatus("Delivered");
orderItemService.insert(orderItem2);
// 从分片库中查询数据
List<OrderItem> orderItemList = orderItemService.selectByOrderId(1L);
System.out.println(orderItemList);
- 示例2:使用Sharding-JDBC进行事务管理
<!-- 开启Sharding事务管理器 -->
<bean id="shardingTransactionManager" class="io.shardingsphere.transaction.spring.ShardingTransactionManager" />
<!-- 注入代理数据源 -->
<bean id="dataSource" class="io.shardingsphere.spring.boot.datasource.SpringBootConfigurationDataSourceFactoryBean" />
<!-- 使用事务注解 -->
<tx:annotation-driven transaction-manager="shardingTransactionManager"/>
<!-- 为某个方法开启事务 -->
@Transactional
public void batchInsert(List<OrderItem> orderItemList) {
for (OrderItem orderItem : orderItemList) {
orderItemMapper.insert(orderItem);
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用sharding-jdbc实现水平分库+水平分表的示例代码 - Python技术站