一、Sharding-JDBC简介
Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。 它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
- 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
- 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
- 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
使用Sharding-JDBC可以实现数据分片、读写分离、分布式事务等需求。
本篇文章主要介绍通过Sharding-JDBC实现数据分片,即分库分表。
Sharding-JDBC提供了4种配置方式,用于不同的使用场景。本文只介绍Spring命名空间配置和SpringBoot配置。
二、准备工作
在虚拟机上部署两台Mysql服务器,IP地址分别为192.168.0.150,192.168.0.152。
然后创建数据库,数据库名分别为sharding_order,shard_order以示区分。
在sharding_order,shard_order中均创建两张结构一致的表,表名分别为t_order_1,t_order_2。建表语句如下:
CREATE TABLE `t_order_1` (
`id` int NOT NULL,
`order_amount` decimal(10,2) NOT NULL,
`order_status` int NOT NULL,
`user_id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
三、创建项目
然后通过MyBatis Generator创建实体类和Dao层接口及Mapper文件。配置如下:
四、Spring命名空间配置
在pom文件中引入Sharding-JDBC命名空间配置的依赖
org.apache.shardingsphere
sharding-jdbc-spring-namespace
4.1.1
在resources目录下新建配置文件sharding-jdbc.xml,内容如下:
在启动类上添加@ImportResource
和@MapperScan
注释
在测试类中创建测试方法
@SpringBootTest
class ShardingDemoApplicationTests {
@Resource
OrderMapper orderMapper;
@Test
void contextLoads() {
}
@Test
public void testOrder(){
Order order=new Order();
order.setId(21);
order.setOrderAmount(BigDecimal.TEN);
order.setOrderStatus(0);
order.setUserId(1);
orderMapper.insert(order);
}
}
这里id设置为21,user_id设置为1,根据前面配置的分库规则使用user_id取模结果为1,所以该记录会落在数据源ds1中,即152服务器上的数据库。根据分表的规则id取模再加1,结果为2,所以该记录最终落在152数据库shard_order数据库中的t_order_2表中。
再将id设置为22,user_id设置为2,该记录最终应落在150数据库sharding-order的t_order_1中。
五、SpringBoot配置
将Spring命名空间配置的依赖删除或注释,引入SpringBoot配置的依赖
org.apache.shardingsphere
sharding-jdbc-spring-boot-starter
4.1.1
-->
在application.properties中添加以下配置
spring.shardingsphere.datasource.names=ds0,ds1
spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.jdbcUrl=jdbc:mysql://192.168.0.150:3306/sharding_order
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=
spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.jdbcUrl=jdbc:mysql://192.168.0.152:3306/shard_order
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=
spring.shardingsphere.sharding.tables.t_order.actual-data-nodes=ds$->{0..1}.t_order_$->{1..2}
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.t_order.table-strategy.inline.algorithm-expression=t_order_$->{id % 2 + 1}
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_order.database-strategy.inline.algorithm-expression=ds$->{user_id % 2}
mybatis.mapper-locations=/mapper/*.xml
将启动类上的@ImportResource
删除或者注释
测试方法同Spring命名空间配置的方式。