前言
需求前提就是处理表数据,数据库表数据过量的话,会导致一个问题就是数据库过亿的话查询起来会耗时,我说的是关联查询,多个条件组合查询同时与其他表字段进行关联性查询,这个很容易拖慢性能,所以在这里需要添加一个定时器进行自动的到时候比如说一个季度进行分区分表。很久远的代码涉及,现在已经有其他方式来实现分表,这里的java代码主要是定时分区来设计;
自定义分区的DAO+Mapper层实现的关键性代码如下
public interface PartitionsMapper extends BaseMapper<Partitions> {
/**
* 将mysql TO_DAYS()函数生成的时间戳还原成时间
*
* @param timeStamp
* @return
*/
@Select("select from_days(#{timeStamp})")
String fromDays(@Param("timeStamp") Long timeStamp);
/**
* 将mysql UNIX_TIMESTAMP()函数生成的时间戳还原成时间
*
* @param timeStamp
* @return
*/
@Select("select from_unixtime(#{timeStamp})")
String fromUnixtime(@Param("timeStamp") Long timeStamp);
/**
* 表建分区
*
* @param tableName
* 表名
* @param partitionSqlPart
* 分区sql片段
*/
@Update("alter table ${tableName} ${partitionSqlPart}")
void executeSql(@Param("tableName") String tableName, @Param("partitionSqlPart") String partitionSqlPart);
}
定时器实现的源码如下
import com.core.utils.DateUtil;
import com.dao.entity.TbmTablePartitionConfig;
import com.dao.entity.sys.Partitions;
import com.dao.service.TbmTablePartitionConfigDao;
import com.dao.service.sys.PartitionsDao;
import com.provider.enums.PartitionColumnDataType;
import com.provider.enums.TablePartitionType;
import com.google.common.collect.Lists;
import org.apache.commons.collections4.CollectionUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.List;
/**
* 自动创建表分区
*
* @author lizx
* @since 2019-07-02
*/
@Component
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class AutoCreateTablePartitionsJob extends QuartzJobBean {
@Autowired
private TbmTablePartitionConfigDao tbmTablePartitionConfigDao;
@Autowired
private PartitionsDao partitionsDao;
@Value("${table_schema}")
private String tableS