一. 引言

  目前开发的XX出行系统,需要开发数据统计功能,鉴于约约出行系统已经在运营,并且有新版本的迭代,方便以后下个版本复用,遂新建一个子系统。

二. 架构设计

  

三. 具体实现

   1.MySql数据库

  (1)配置表:使用配置表,控制要执行的存储过程。

CREATE TABLE `t_report_config` (
`uuid` varchar(32) NOT NULL COMMENT '主键ID',
`source_view` varchar(64) NOT NULL COMMENT '数据源视图',
`result_table` varchar(64) NOT NULL COMMENT '结果存储表',
`cycle` int(11) NOT NULL COMMENT '周期类型(1:小时,2:天)',
`status` int(11) DEFAULT NULL COMMENT '状态(0:失败,1:成功)',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='统计报表_配置表';

  (2)存储过程:存储过程根据配置表给的视图名和存储表,将视图的数据存储到存储表中。

CREATE DEFINER=`admin`@`%` PROCEDURE `P_REPORT_CONFIG`(IN args_cycle INT)
BEGIN
-- 需要定义接收游标数据的变量 -- 配置表主键ID
DECLARE var_uuid CHAR (32); -- 数据源视图
DECLARE var_source_view CHAR (64); -- 结果存储表
DECLARE var_result_table CHAR (64); -- 周期类型(1:小时,2:天)
DECLARE var_cycle INT; -- 状态(0:失败,1:成功)
DECLARE var_status INT; -- 动态SQL语句
DECLARE sqlStr VARCHAR(500); -- 遍历数据结束标志
DECLARE done INT DEFAULT FALSE; -- 游标
DECLARE cur CURSOR FOR SELECT
trc.uuid var_uuid,
trc.source_view var_source_view,
trc.result_table var_result_table,
trc.cycle var_cycle,
trc.status var_status
FROM
t_report_config trc WHERE trc.cycle = args_cycle
; -- 将结束标志绑定到游标
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET done = TRUE; -- 打开游标
OPEN cur; -- 开始循环
read_loop :
LOOP
-- 提取游标里的数据,这里只有一个,多个的话也一样;
FETCH cur INTO
var_uuid,
var_source_view,
var_result_table,
var_cycle,
var_status; -- 声明结束的时候
IF done THEN
LEAVE read_loop; END
IF; -- 这里做你想做的循环的事件 SET @tableName = var_result_table;
SET @viewName = var_source_view;
set sqlStr = CONCAT('INSERT INTO ',@tableName,' SELECT * FROM ',@viewName);
SET @sqlstr = sqlStr;
PREPARE stmt from @sqlstr;
EXECUTE stmt;
deallocate prepare stmt; UPDATE t_report_config trc SET trc.`status` = 1,trc.update_time = NOW() WHERE trc.uuid = var_uuid; END
LOOP
; -- 关闭游标
CLOSE cur; END

  (3)视图(略):查询的SQL,放到新建视图就可以生成。假设存储过程的入参是1,那么就使用所有配置表中cycle=1的记录,每小时统计一次。

  (4)远程表连接:FEDERATED:FEDERATED存储引擎是访问远程数据库中的表,在平时开发中可以用此特性来访问远程库中的参数表之类的,还是非常方便的。使用时直接在本地构建一个federated表来链接远程数据表,配置好之后本地数据库可以直接和远程数据表进行同步,实际上这个数据库并不是真实存放数据,所需要的数据都是存放在远程服务器上。配置条件:mysql版本需要5.1以上;在安装是需要把federated引擎已经安装;检查是否开启:show engines;如果没开启,则:修改mysql的配置文件,在my.ini中[mysqld]标签下下直接加上一行 federated重启数据库服务即可。建立远程表连接:ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='订单表' CONNECTION='mysql://user:password@ip:port/schema/tableName';

CREATE TABLE `yy_order` (
`uuid` char(32) NOT NULL,
`order_no` varchar(32) DEFAULT NULL COMMENT '订单号',
PRIMARY KEY (`uuid`),
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='订单表' CONNECTION='mysql://user:password@ip:port/schema/tableName';

  2.Java工程方面

  (1)定时器类:

package com.summersoft.ts.base;  

import com.summersoft.ts.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component("processTask")
public class ProcessTask { @Autowired
private ConfigService configService; /**
* 执行存储过程(小时)
*/
public void runHourProcess(){
configService.processReportConfig(1);
} /**
* 执行存储过程(天)
*/
public void runDayProcess(){
configService.processReportConfig(2);
}
}

  (2)定时器配置:applicationContext.xml里面<beans></beans>添加配置
  

<!-- 定时任务配置 -->
<task:scheduled-tasks>
<task:scheduled ref="processTask" method="runHourProcess" cron="0 0 * * * *" />
<task:scheduled ref="processTask" method="runDayProcess" cron="0 0 3 * * *" />
</task:scheduled-tasks>

  (3) ConfigService:

package com.summersoft.ts.service;  

public interface ConfigService {
void processReportConfig(int cycle);
}

  (4)ConfigServiceImpl:

package com.summersoft.ts.service.impl;  

import com.summersoft.ts.dao.ReportConfigDao;
import com.summersoft.ts.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service("configService")
public class ConfigServiceImpl implements ConfigService { @Autowired
private ReportConfigDao configDao; @Override
public void processReportConfig(int cycle) {
try {
configDao.processReportConfig(cycle);
}catch (Exception e){
System.out.println("存储过程执行异常:"+e.getMessage());
}
}
}

  (5)ReportConfigMapper.xml对应的SQL写法:

<select id="processReportConfig" statementType="CALLABLE" parameterType="int">
{CALL P_REPORT_CONFIG(#{cycle, mode=IN, jdbcType=INTEGER})}
</select>

  

XX出行项目子系统-统计系统设计(定时器项目设计例子)的更多相关文章

  1. 【NLP】Python实例:申报项目查重系统设计与实现

    Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...

  2. Linux时间子系统之四:定时器的引擎:clock_event_device

    早期的内核版本中,进程的调度基于一个称之为tick的时钟滴答,通常使用时钟中断来定时地产生tick信号,每次tick定时中断都会进行进程的统计和调度,并对tick进行计数,记录在一个jiffies变量 ...

  3. Linux时间子系统之四:定时器的引擎:clock_event_device【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/8017604 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  4. 四则运算项目git统计

    GitHub统计 1.Git文档目录 图 1文档结构预览 2.Git提交进度图 图 2 9月12日-10月3日 图 3 10月3日-10月14日 图 4 10月14日-10月21日 图 5 10月21 ...

  5. spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象

    最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...

  6. .net数据统计系统设计(中小型)

    近一年多没在博客园写东西了,从换公司后就一直努力学习公司的框架和业务.而今接手一个电商数据统计项目,在博客园搜索统计项目解决方案却一无所获,最终自己设计并在开发的过程中持续更新,希望可以和大家一起交流 ...

  7. Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()

    我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A ...

  8. Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()【转】

    转自:http://blog.csdn.net/droidphone/article/details/8104433 我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子 ...

  9. 个人项目-词频统计(语言:C++)

    词频统计 (个人项目) 要求 (1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率. 附加要求:读入一段文本文件,统计该文本文件中单词的频率. (2) ...

随机推荐

  1. iOS应用启动原理图解 及ARC强弱引用

    iOS应用启动原理图解(红色箭头表示strong强引用,绿色箭头代表weak若引用) 只要将UI控件拖到Storyboard里控制器的大view上,Xcode会自动将这些控件以强引用的形式加入到sel ...

  2. div自适应水平垂直居中的方法

    1.Flexbox布局: display:flex; justify-content:center; align-items:center; width:100%; 2.Bootstrap栅格布局 一 ...

  3. 分别用Eclipse和IDEA搭建Scala+Spark开发环境

    开发机器上安装jdk1.7.0_60和scala2.10.4,配置好相关环境变量.网上资料很多,安装过程忽略.此外,Eclipse使用Luna4.4.1,IDEA使用14.0.2版本. 1. Ecli ...

  4. AppleDoc

    使用AppleDoc快速生成iOS开发文档 _ 皮卡丘♪-(´ε` ) 用 appledoc 生成文档 _ Garan no dou xcode-select_ error_ tool 'xcodeb ...

  5. js中哪些值会被认为false?

    在javascript中,只有 false null undefined 空字符串 即 “” 数字  0 数字 NaN 会被当作false,其余都是真. 注:字符串 “false” 也会被当作真.

  6. 课时133.margintop失效原因(理解)

    我们之前讲过如果只有子元素设置了margin top而父元素没有边框则会跟着被顶下来的. 而我们怎么解决这个问题呢? 就是给父元素设置一个边框 而为什么我们在第二个浮动的盒子设置边框没有用呢?应为第一 ...

  7. 微信支付tp5.1集合

    多商户号微信支付 配置 自己改一改 逻辑 就好了! 写的菜 勿喷 extend下面 主要目录 多商户号 配置项 根据自己的需求更改 可能有一些地方存在BUG 自己调试一下 就OK了,别像一个麻瓜一样 ...

  8. laravel-admin 创建数据库并生成控制器

    以user表为例 1. 生成迁移:php artisan make:migration create_users_table 在 database/migration 中生成迁移文件,可对迁移文件进行 ...

  9. 批量改变图片的尺寸大小 python opencv

    我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的. 以上为原图片. import cv2 import os # 按指定图像大小调整尺寸 def resi ...

  10. Goland的常用快捷键

    文件相关快捷键: CTRL+E,打开最近浏览过的文件. CTRL+SHIFT+E,打开最近更改的文件. CTRL+N,可以快速打开struct结构体. CTRL+SHIFT+N,可以快速打开文件. 代 ...