springBoot集成ShardingSphere实现单库分表
我们在开发项目的时候,会遇到有一个或者几个表的数据量特别大的情况。比如商城中的订单表。这个是随着时间的推进越来越多。所以需要进行分表来处理。让单表的数量不要太多。所以这个时候需要进行分表操作。我们使用比较流行的shardingsphere来实现。...
·
我们在开发项目的时候,会遇到有一个或者几个表的数据量特别大的情况。比如商城中的订单表。这个是随着时间的推进越来越多。所以需要进行分表来处理。让单表的数量不要太多。所以这个时候需要进行分表操作。我们使用比较流行的shardingsphere来实现。
一:引入jar包
<!--shardingsphere start-->
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-namespace</artifactId>
<version>4.1.1</version>
</dependency>
二:在application.properties中设置
# 数据源 master (当前只有一个)
spring.shardingsphere.datasource.names=master
# 数据源 主库
spring.shardingsphere.datasource.master.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.url=jdbc:mysql://localhost:3306/db0?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=
###分表策略 其中user为逻辑表 分表主要取决于id行
spring.shardingsphere.sharding.tables.user.actual-data-nodes=master.user_$->{0..1}
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
### 行表达式分片策略 begin (如果没有下面的这两行。user_0和user_1都会存相同的数据) ###
# 根据这个列分表
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
# 分表规则为:对 asset_package_id 取模
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_$->{id % 2}
### 行表达式分片策略 end###
# 绑定表规则列表, 多个用逗号隔开
spring.shardingsphere.sharding.binding-tables[0]=user
#spring.shardingsphere.sharding.binding-tables[1]=test
#打印sql
spring.shardingsphere.props.sql.show=true
三:创建表
CREATE TABLE `user_0` (
`id` bigint(32) NOT NULL,
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `user_1` (
`id` bigint(32) NOT NULL,
`name` varchar(10) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
注意:
1:这两个表名要根据application.properties中的设置一样。
spring.shardingsphere.sharding.tables.user.actual-data-nodes=master.user_$->{0..1}
2:由于生成的id是雪花算法。所以id应该要足够大,用bigint(32)就足够了
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
四:实现功能
按照一般的方式dao,service,controller实现创建。
entity
public class User implements Serializable {
private long id;
private String name;
private Integer age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
mapper
public interface UserMapper {
int insert(User record);
List<User> selectByExample(UserExample example);
}
xml
<insert id="insert" parameterType="com.zhm.entity.User">
insert into user (name, age)
values ( #{name,jdbcType=VARCHAR}, #{age,jdbcType=INTEGER})
</insert>
特别注意:当insert的时候id千万不要写。否则会一直是0。
service
@Service
public class TestService {
@Resource
private UserMapper userMapper;
@Transactional
public Result add(String name) {
try {
User user=new User();
user.setName(name);
user.setAge(12);
userMapper.insert(user);
return Result.sendSuccess("新增成功");
} catch (Exception e) {
e.printStackTrace();
return Result.sendFailure("新增失败");
}
}
public Result query() {
UserExample example=new UserExample();
UserExample.Criteria crt=example.createCriteria();
List<User> list= userMapper.selectByExample(example);
return Result.sendSuccess("查询成功",list);
}
}
controller
@RestController
@RequestMapping(value = "/test")
public class TestController {
@Resource
private TestService testService;
@RequestMapping(value = "/add", method = RequestMethod.GET)
public Result add(@RequestParam(value = "name") String name) {
return testService.add(name);
}
@RequestMapping(value = "/query", method = RequestMethod.GET)
public Result query() {
return testService.query();
}
}
可能出现问题:
shardingjdbc insert时报错Sharding value must implements Comparable
参考:
springboot 整合 Shardingsphere 4.0 分库分表
更多推荐
已为社区贡献3条内容
所有评论(0)