XX出行项目子系统-统计系统设计(定时器项目设计例子)
一. 引言
目前开发的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出行项目子系统-统计系统设计(定时器项目设计例子)的更多相关文章
- 【NLP】Python实例:申报项目查重系统设计与实现
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- Linux时间子系统之四:定时器的引擎:clock_event_device
早期的内核版本中,进程的调度基于一个称之为tick的时钟滴答,通常使用时钟中断来定时地产生tick信号,每次tick定时中断都会进行进程的统计和调度,并对tick进行计数,记录在一个jiffies变量 ...
- Linux时间子系统之四:定时器的引擎:clock_event_device【转】
本文转载自:http://blog.csdn.net/droidphone/article/details/8017604 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- 四则运算项目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 ...
- spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象
最近做了一个java的项目,部门领导给了一套代码让我尽快掌握,说心里话本人真心不喜欢java的这种项目方式,各种配置各种xml文件简直头都大了,下面就将我遇到的其中一个我认为是坑的地方整理出来,希望能 ...
- .net数据统计系统设计(中小型)
近一年多没在博客园写东西了,从换公司后就一直努力学习公司的框架和业务.而今接手一个电商数据统计项目,在博客园搜索统计项目解决方案却一无所获,最终自己设计并在开发的过程中持续更新,希望可以和大家一起交流 ...
- Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()
我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子系统,在时间子系统中提供了一些用于延时或调度的API,例如msleep,hrtimer_nanosleep等等,这些A ...
- Linux时间子系统之七:定时器的应用--msleep(),hrtimer_nanosleep()【转】
转自:http://blog.csdn.net/droidphone/article/details/8104433 我们已经在前面几章介绍了低分辨率定时器和高精度定时器的实现原理,内核为了方便其它子 ...
- 个人项目-词频统计(语言:C++)
词频统计 (个人项目) 要求 (1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率. 附加要求:读入一段文本文件,统计该文本文件中单词的频率. (2) ...
随机推荐
- Before start of result set
ResultSet:在处理结果集的时候出现了问题. 解决办法:while(rs.next())
- OpenID Connect Core 1.0(二)ID Token
2.ID Token(ID Token) OpenID Connect主要是对OAuth 2.0 能够使得终端用户通过ID Token的数据结构进行验证.当客户端和潜在的其他请求声明,ID Token ...
- 三、Hadoop 的 API
1.环境搭建 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...
- Oracle模糊查询
通配符 % 匹配零个或更多的任意字符 _ 匹配一个任意字符 [ ] 匹配指定范围中的一个字符([a-z],[0-9]) [^ ] 不属于指定范围,不包含其中的字符 escape转义 --查询 ...
- 【TOJ 3600】Fibonacci II (对数+斐波那契通项式)
描述 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列(f[0]=0,f[1]=1;f[i] = f[i-1]+f[i-2](i> ...
- 【HDOJ 1337】I Hate It(线段树维护区间最大值)
Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...
- 如何将js字符串变成首字母大写其余小写
有时候会接收到一些大小写不规则的字符串,如"JAMES"."alice"."Amy"等,如何将他们统一的变成首字母大写其余小写的形式呢? 思 ...
- Vue中异步组件(结合webpack,转载)
转载,原文出处:https://www.jianshu.com/p/40a364b5e964 1.什么是异步组件? 异步组件就是定义的时候什么都不做,只在组件需要渲染(组件第一次显示)的时候进行加载渲 ...
- 【转】Red5流服务器搭建(实现在线直播,流媒体视频播放和在线视频会议)
来自:http://blog.csdn.net/sunroyi666/article/details/52981639 一. 先介绍一下流媒体技术:所谓流媒体技术,是指将连续的影像和声音信息经过压缩处 ...
- laravel 安装添加多站点
官方文档如下 https://learnku.com/laravel/t/1160/laravel-nginx-multi-site-configuration