• 日志分表


    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);
            }
        }
        
    }
  • 相关阅读:
    网络编程之粘包问题
    网络编程初识和socket套接字
    面向对象三大特性
    面向对象进阶
    面向对象初接触
    常用模块(模块初步了解)
    异常处理
    Ubutu Chrome 出现adobe flash is out of date的解决方法
    cmder默认的命令提示符λ改成$
    css在盒子中垂直居中和固定居中
  • 原文地址:https://www.cnblogs.com/limingxian537423/p/7518587.html
Copyright © 2020-2023  润新知