前两天遇到一个分表存储的场景,受网上的一点启发,最终实践成功。
场景
库里有个日志表做了分表,主要存储用户在前端操作的日志记录。
我看了下项目中已有的做法
我搜索了一下项目,发现项目中已经有实现这种场景的业务了。但是做法让我很不喜欢。
service 层定义了 10 个mapper,然后通过计算得出存储到第几个表,接着用switch case 判断来存储到不同的表中。
// 定义了 10 个mapper
@Autowired
private LogCzrz0Mapper czrzMapper0;
@Autowired
private LogCzrz1Mapper czrzMapper1;
...
@Autowired
private LogCzrz9Mapper czrzMapper9;
public void save() {
// 通过计算得出num,表示存储到哪个表
int num = calculate();
switch (num) {
case 0:
czrzMapper0.save();
break;
case 1:
czrzMapper1.save();
break;
...
case 9:
czrzMapper9.save();
break;
}
}
上面写了一段伪代码,计算出 num,再存储到相对应的表中。
受网上启发
在 mapper.xml 定义 sql 的时候是可以将分表后面的 num 作为一个变量。