日志分表

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

}
时间: 2024-10-27 03:04:35

日志分表的相关文章

hibernate分表保存日志

@Service("accessLogService")@Transactionalpublic class LogMessageServiceImpl extends BaseDaoServiceImpl<AccessLogMessage,Long> implements LogMessageService{ @Autowired SplitHibernateInterceptor splitInter;  @Autowired public BaseDaoImpl<

mysql如何查询多样同样的表/sql分表查询、java项目日志表分表的开发思路/按月分表

之前开发的一个监控系统,数据库的日志表是单表,虽然现在数据还不大并且做了查询sql优化,不过以后数据库的日志表数据肯定会越来越庞大,将会导致查询缓慢,所以把日志表改成分表,日志表可以按时间做水平分表,我是按月分的,每个月一张表,这时候的问题是 数据库有多张同样的分表如何根据条件查询? 在进行分页的时候如何计算总记录数?如何查询出所有分表? 每个月的新表是如何创建?系统如何自动创建? 不确定哪个分表的情况如何查询某一条详细记录? 分表查询分表查询可以用union或者union all进行查询uni

数据库水平切分的实现原理解析——分库,分表,主从,集群,负载均衡器(转)

第1章 引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于 一个大型的互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的问题.通过数据切分来提高网站性能,横向 扩展数据层已经成为架构研发人员首选的方式. 水平切分数据库:可以降低单台机器的负载,同时最大限度的降低了宕机造成的损失: 负载均衡策略:可以降低单台机器的访问负载,降低宕机的可能性: 集群方案:解决了数据库宕机带来的单点数据库不能访问的问题: 读写分离策略:最大

分表后 快速查询所有数据

MERGE存储引擎把一组MyISAM数据表当做一个逻辑单元来对待,让我们可以同时对他们进行查询.构成一个MERGE数据表结构的各成员MyISAM数据表必须具有完全一样的结构.每一个成员数据表的数据列必须按照同样的顺序定义同样的名字和类型,索引也必须按照同样的顺序和同样的方式定义. 假设你有几个日志数据表,他们内容分别是这几年来每一年的日志记录项,他们的定义都是下面这样,YY代表年份: [sql] view plain copy CREATE TABLE log_YY ( dt  DATETIME

MySQL性能优化:分表、增量备份、还

对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据是 最重要的.关键字:UNION 例: 订单表根据订单

分享一个MySQL分库分表备份脚本(原)

分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上时间方便整理 2.取数据库:抓取数据库名称,我用的awk和grep配合取数据库的名称(如果想按照表备份可以再细化一下)注意要用mysql -e选项 这样才能做成脚本 3.系统环境变量:因为用到了函数,所以非系统内置的命令 最好在脚本里面用 . /etc/profile  把系统当前的环境变量传过来

Mycat读写分离和分库分表配置

Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy.其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端mysql存储引擎里面.最新版本的Mycat不仅支持mysql,还可以支持MS SqlServer,Oracle,DB2等关系型数据库,而且还支持MongoDB这种NoSQL.Mycat对调用者屏蔽了后端存储具体实现. Mycat的原理是先拦截用户的SQL语句并做分

架构之数据库分表分库

1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的数据量.数据处理能力都将遭遇瓶颈.3 分库分

数据库分表设计-任我行

本文只阐述一个完整的实例,直接可以复制过去用,不作过多的解释. 简单说一下分表与分区: 分区的原理:我在深圳市,但我也在中国,如果中国没有划分区域的话,搜索范围将是整个中国,查询起来很费力.现在既然中国已经划分区域当然可以直接来深圳市找我了,是不是快了很多. 分表的原理:我在中国,通过某种算法(比如查户口)知道了我在深圳,是不是也可以直接来深圳市找我,其他区域就不用去看了,本文的算法为dbo.GetTableName(),通过这个算法知道了数据存储在哪张表里面. --用于保存所有日志ID,与操作