使用SpringBoot分库分表组件的时候,要实现按月分表就需要按照下面的步骤进行配置。
步骤一:配置yml或properties文件
首先,我们需要在配置文件中设置分表相关的属性,例如:
spring:
sharding:
tables:
student:
actual-data-nodes: ds$->{0..1}.student$->{2019..2020}_$->{1..12}
table-strategy:
standard:
sharding-column: create_time
precise-algorithm-class-name: com.example.demo.algorithm.PreciseShardingAlgorithm
key-generator:
column: id
type: SNOWFLAKE
database-strategy:
inline:
sharding-column: id
algorithm-expression: ds${id % 2}
以上是一个以月份分表的例子,配置中"student"是我们要进行分表操作的表名,"ds$->{0..1}"意味着我们有两个删库分表的数据库,这里假设是"ds0"和"ds1"。"$->{2019..2020}"表示我们要进行分表的时间范围是2019年到2020年,"$->{1..12}"表示月份。那么这个配置就意味着我们需要创建24个表,分为2个数据库,每个数据库中包含12个表。
其中,actual-data-nodes属性指定了数据库及表的个数。我们指定两个数据库,每个数据库包含12个表,这个符合了按照月份分表的要求。table-strategy属性中指定了按照create_time字段进行分表且使用了自定义的精确分表算法,algorithm-class-name属性对应的com.example.demo.algorithm.PreciseShardingAlgorithm为我们自己编写的具体的分表算法。
步骤二:编写自定义的精确分表算法类
我们需要自己编写一个类,继承自PropsShardingAlgorithm。例如:
public class PreciseShardingAlgorithm implements PreciseShardingAlgorithm<Date> {
private static final Logger log = LoggerFactory.getLogger(PreciseShardingAlgorithm.class);
@Override
public String doSharding(Collection<String> tableNames, PreciseShardingValue<Date> shardingValue) {
log.debug("actual-data-nodes:" + tableNames + ", shardingValue:" + shardingValue);
Date createTime = shardingValue.getValue();
SimpleDateFormat format = new SimpleDateFormat("yyyy_MM");
String yearMonthStr = format.format(createTime);
String targetTableName = shardingValue.getLogicTableName() + "_" + yearMonthStr;
for (String tableName : tableNames) {
if (tableName.equals(targetTableName)) {
return tableName;
}
}
throw new IllegalArgumentException("无法定位到具体表:" + targetTableName);
}
}
上面的代码中,我们看到实现了doSharding方法,这个方法就是用来实现按照指定条件进行分表的核心代码。在我们的实现中,是根据create_time字段的值来计算该记录应该被插入到哪张表中。而表名按照"表名_年_月"的命名方式来存储。
步骤三:代码实现
以上两个步骤完成之后,就可以在我们的应用程序中进行编写代码了。假设我们要进行新增一个学生信息的操作,代码如下:
@Service
public class StudentService {
@Autowired
private StudentMapper studentMapper;
public int insert(Student student) {
student.setCreateTime(new Date());
return studentMapper.insert(student);
}
}
在我们的代码中,studentMapper.insert(student)就是要执行新增操作的语句,而setCreateTime(new Date())就是为create_time字段赋值。这里的日期可以是任何形式的,只要它能够被我们的PreciseShardingAlgorithm类计算。
以上就是实现按照月份进行数据库分表的一个完整攻略。我们可以利用这个攻略来完成类似的场景,例如按照年或按照季度进行分表。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 按月分表的实现方式 - Python技术站