1. sharding sphere 4.0.0-RC1版本 按年分表(后续优化)
1.1. 概述
关于上一篇中LogShardingAlgorithm
的tables
,我原先是在第一次调用的时候初始化,这样做虽然能实现功能,但每次调用都会走这个if判断,虽然性能损耗不大,但我觉得这不是业务应该走的逻辑顺序,我的理想是在LogShardingAlgorithm
被实例化后去自动初始化tables
现在面对的问题是LogShardingAlgorithm
的实例化是在Spring初始化中间执行的,且它本身的创建不是通过Spring的@Component
等注解生成,而是通过反射实例化。若在实例化刚开始,也就是构造方法执行的时候执行初始化,那时候applicationContext
还没有初始化完毕,拿不到环境参数,连Datasource
也还没开始初始化
1.2. 解决方法
经过改造后,代码如下,单独拎出一个初始化方法,在类对象实例化后调用
/**
* @author: laoliangliang
* @description: 日志分片
* @create: 2020/1/2 10:19
**/
@Slf4j
public class LogShardingAlgorithm implements PreciseShardingAlgorithm, RangeShardingAlgorithm<Integer> {
/**
* 缓存存在的表
*/
private List<String> tables;
private final String systemLogHead = "system_log_";
public void init(){
tables = DBUtil.getAllSystemLogTable();
}
@Override
public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) {
String target = shardingValue.getValue().toString();
String year = target.substring(target.lastIndexOf("_") 1, target.lastIndexOf("_") 5);
if (!tables.contains(systemLogHead year)) {
DBUtil.creat