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; } }