日志分表

1.每15天保存一份日志表

2.每个月创建3份备用的表

3.项目发布时,利用spring的监听器进行监听创建表

http://blog.csdn.net/chszs/article/details/49097919

定时在凌晨进行分表操作

 

DATE的格式化必须注意大小写:

MM:月份

mm:分钟

中间连接符无所谓

将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
/**
     * 生成日志表名
     * @param offset
     * @return
     */
    public static String generateTableName(int offset){
        //使用Calendar类代表当前时间,Calendar在国际化方面有好处
        Calendar calendar = Calendar.getInstance();
        //通过偏移量改变月份信息,作为创建的表名识别
        calendar.add(Calendar.MONTH, offset);
        //返回date类型carlendar
        Date time = calendar.getTime();
        //改变Date的格式
        String timePart = new SimpleDateFormat("yyyy_MM").format(time);
        //返回生成的表名给创建表用
        return "AUTO_LOG_TABLE_"+timePart;
    }

mybatis ${}拼字符串,给预编译后不需要赋值的字段赋值

#{}会有预编译,防止注入问题

mybatis采用

<update>标签来创建表格

  <!-- 在SQL语句中只有具体传值的地方可以写?,其他地方都不行 -->
  <!-- CREATE TABLE #{tableName} LIKE `manager_log` -->
  <!-- CREATE TABLE ? LIKE `manager_log` -->
  
  <!-- ${}与#{}会被翻译为?占位符不同,起拼字符串的作用 -->
  <update id="createTable">
      CREATE TABLE IF NOT EXISTS ${tableName} LIKE `manager_log`
  </update>

spring的监听器

实现

(1)ApplicationListener接口,同时重写onApplicationEvent()方法
(2)将该类注册到spring的ioc容器中。

②创建Spring监听器

[1]创建一个类实现org.springframework.context.ApplicationListener<E>
[2]在E泛型位置指定一个具体的事件类型
[3]重写onApplicationEvent()方法
[4]在Spring的配置文件中配置Spring监听器的bean
③Spring和SpringMVC的IOC容器启动时都会触发ContextRefreshedEvent事件,从而调用onApplicationEvent()方法
④通过对当前IOC容器进行打印,发现Spring的IOC容器确实是SpringMVC的IOC容器的父容器。
[1]子容器可以引用父容器中的bean
[2]父容器不能引用子容器中的bean
⑤将Spring的监听器用于创建日志表需要注意一个问题:两个IOC容器启动都会触发事件。但是建表不用建两次。

我们可以将“是否有父容器”作为判断依据。

public class CreateTableListener implements ApplicationListener< ContextRefreshedEvent>{
    @Autowired
    private LogService logService;
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        // 获取当前容器对象
        ApplicationContext applicationContext = event.getApplicationContext();
        // 获取容器对象的父容器
        ApplicationContext parent = applicationContext.getParent();
        //
        if(parent==null){
            System.out.println("不存在父容器");
        }else{
            //创建表
            String tableName = DataprocessUtils.generateTableName(0);
            logService.createTable(tableName);
            tableName = DataprocessUtils.generateTableName(1);
            logService.createTable(tableName);
            tableName = DataprocessUtils.generateTableName(2);
            logService.createTable(tableName);
            tableName = DataprocessUtils.generateTableName(3);
            logService.createTable(tableName);
        }
    }
    
}

 

posted @ 2017-09-14 02:26  lamsey16  阅读(931)  评论(0编辑  收藏  举报