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