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) ...
随机推荐
- ViewController里的loadView和viewDidLoad什么区别
当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载或者创建一个view对象 ...
- M4修改外部晶振8M和25M晶振的方法
共计修改三个参数: 1.HSE_VALUE 具体位置在stm32f4xx.h中 2.PLL_M 具体位置在system_stm32f4xx.c中 3.Keil编译器 工程的Opt ...
- Python 学习笔记(十)Python集合(二)
集合常用的方法 add() 向集合中增加一个元素,如果集合中已经有了这个元素,那个这个方法就会失效 >>> help(set.add) Help on method_de ...
- 时间、时间戳相关小结 - iOS
项目中难免会与时间打交道,故此次围绕时间展开做了一些日常使用的小结;如下 code 中也是围绕一些日常开发中较为常用的点展开小的方法封装. 具体方法的使用如下: // 2019-02-21 17:30 ...
- ubuntu下的数据库和python存储库安装——MySQL,MongoDB,Redis
MySQL 的安装 sudo apt-get updatesudo apt-get install -y mysql-server mysql-client 启动.关闭和重启MySQL 服务的命令如下 ...
- Gitlab 自动构建心得
上面是简单接受一下gitlab ci的工作原理 GitLab-CI 这个是一套配合GitLab使用的持续集成系统,是GitLab自带的,也就是你装GitLab的那台服务器上就带有的.无需多考虑..gi ...
- PHP变量问题,Bugku变量1
知识点:php正则表达式,php函数,全局变量GLOBALS(注意global和$GLOBALS[]的区别) PHP函数: isset(): 条件判断 get方法传递的args参数是否存在 p ...
- while do while switch语句的简要分析
1 //// while是C语言的一个关键字,其后是使用一个小括号中的条件表达式来做为执行循环的条件, 2 ////也就是说当条件表达式的结果为真时执行大括号里面的的程序内容, 3 ////而当条件表 ...
- 18CCPC网赛A 贪心
Buy and Resell Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 棋盘覆盖(我们学校自己的UOJ上的变形题)
题目 #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> # ...