Newer
Older
smartwell_demos / src / main / java / com / casic / service / impl / PartitionStrategyServiceImpl.java
chaizhuang on 18 Sep 2023 4 KB 定时器,自动分区表创建
package com.casic.service.impl;

import com.alibaba.druid.util.StringUtils;
import com.casic.dao.PartitionStrategyMapper;
import com.casic.service.IPartitionStrategyService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 自动创建分区
 *
 * @author cz
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class PartitionStrategyServiceImpl implements IPartitionStrategyService {
    /**
     * 提前创建分区个数
     */
    @Value("${casic.ss.advancePartitionNum:3}")
    private int advancePartitionNum;
    /**
     * 分区创建间隔(天)
     */
    @Value("${casic.ss.partitionInterval:7}")
    private int partitionInterval;
    /**
     * 分区创建间隔(天)
     */
    @Value("${casic.ss.dbName:CASIC203}")
    private String partitionDbName;

    @Value("${casic.ss.dataFilePath:c:\\dm\\}")
    private String dataFilePath;

    @Value("${casic.ss.enableTableSpace:false}")
    private boolean enableTableSpace;

    @Value("${casic.ss.tableSpaceSize:512}")
    private int tableSpaceSize;

    private final PartitionStrategyMapper partitionStrategyMapper;

    @Override
    public void createPartition(String tableName, String tableSpaceFix) {
        Calendar end = Calendar.getInstance();
        String storage = null;
//        if (enableTableSpace) {
//            storage = createTableSpace(tableSpaceFix);
//        }
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        end.add(Calendar.DAY_OF_MONTH, advancePartitionNum * partitionInterval);
        Long maxTime = end.getTimeInMillis();
        String timeStr = partitionStrategyMapper.selectMaxId(tableName, "XLJC");
        String tempTableName = "XLJC." + tableName;
        Long time = null;
        if (StringUtils.isEmpty(timeStr) && timeStr.contains("DATE")) {
            time = System.currentTimeMillis();
        } else {
            timeStr = timeStr.substring(9);
            try {
                time = Long.valueOf(sdf1.parse(timeStr).getTime());
            } catch (ParseException rx) {
                log.error("转换日期异常");
            } finally {
                if (time == null) {
                    time = System.currentTimeMillis();
                }
            }
        }
        //必须超出一天进行创建表
        if (maxTime - time > 86400000000L) {
            while (time <= maxTime) {
                Calendar calendar = Calendar.getInstance();
                calendar.setTimeInMillis(time);
                calendar.add(Calendar.DAY_OF_MONTH, partitionInterval);
                time = calendar.getTimeInMillis();
                Date date = new Date(time);
                String parTime = "\'" + sdf2.format(time) + "'";
                partitionStrategyMapper.createPartition(tempTableName, "P" + sdf1.format(date).substring(2), parTime, storage);
            }
        }
//        if (tableName.equals("T_CLOCK_DATA")) {
//            tempTableName = "CASIC_SYSTEM." + tableName;
//            time = partitionStrategyMapper.selectMaxId(tableName, "CASIC_SYSTEM");
//            if (ObjectUtils.isEmpty(time)) {
//                time = Calendar.getInstance().getTimeInMillis();
//            }
//            while (time <= maxTime) {
//                Calendar calendar = Calendar.getInstance();
//                calendar.setTimeInMillis(time);
//                calendar.add(Calendar.DAY_OF_MONTH, partitionInterval);
//                time = calendar.getTimeInMillis();
//                String formatTime = DateUtil.format(new Date(time), "yyyyMMdd");
//                partitionStrategyMapper.createPartition(tempTableName, "P" + formatTime.substring(2), time, storage);
//            }
//        }
    }

    /**
     * .*2021-12.*
     * 创建表空间
     */
    @Override
    public String createTableSpace(String tableSpaceFix) {
//        String currMouth = tableSpaceFix + DateUtil.format(new Date(), "yyyyMM");
//        //判断当月度分区是否已经存在
//        if (!FileUtil.exist(dataFilePath, ".*" + currMouth + ".*")) {
//            String pathFile = "'" + dataFilePath + currMouth + ".dbf" + "'";
//            partitionStrategyMapper.createTableSpace(currMouth, pathFile, tableSpaceSize);
//        }
//      return currMouth;
        return null;
    }

}