SRP的一个实例(1)
这两天报过来个bug,和大家讨论了解决方案后,觉得这正是SRP一个广义上的实例,值得记录一下。
先讲一下业务情况:
数据库中有一些存储过程,目的是生成报表数据。应用服务器上有一个Java写的Timer,定期(通常是一周,一月或一年末)调用这些存储过程,更新报表数据。这些存储过程中任何一个都能被顺序执行任意多次而不会出错,但如果同一个存储过程的两个实例并发执行会产生错误结果。
先前的处理方法基于以下两个考虑:
1)需要一个统一框架控制并发问题,不用在每个存储过程内部考虑并发问题。
2)出现意外情况时,系统能够自动恢复。这样不会在半夜两点钟被电话叫醒去修BUG。
基于以上的考虑,Java端Timer实现以下:
public void Scheduler ... {
ResetAllFlag(false);
}
// Task to run
public void run(String storedProcedureName, Param[] params )... ... {
bool isRunning=getRunningFlagFromDB(storeProcedureName);
//last task has finished;
if (isRunning)......{
return();
}
//else{
setRunningFlagToDB(storedProcedureName,true);
updateRunningTimeToDB(storedProcedureName);
runStoredProcudureInDB(storedProcedureName,params);
setRunningFlagToDB(storedProcedureName,false);
}
}
}
在DB中有一张Lock表,包括以下字段(Name,State),后台的Java Scheduler用这张表中相应行实现锁。每次Scheduler重启时会重置所有的程序运行状态为false,当一个存储过程被调用时,Java Scheduler检查此程序状态是否为正在运行,如果是则不作。如果不是则置状态为运行->运行->重置状态。
用户反映,某些报表中数据异常大,看起来似乎是翻倍了。也就是说,还是有某些存储过程被并发执行了。
那么,问题出在哪儿呢?
...太晚了,明天继续吧
SRP的一个实例(1)相关推荐
- 限制程序只打开一个实例(转载)
当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...
- 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?...
string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 "=" ,每次 "=" 操作都是一次 "new". ...
- iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.
2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...
- docker 主进程 日志_[docker]从一个实例,一窥docker进程管理
在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...
- 让Java程序只运行一个实例
一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...
- php单例模式的实例,PHP的单例模式的一个实例_php
这篇文章对于php单例模式的解释并不一定完善!只是举一个实例而已,目的是让我自己通过一个实例可以加深对单例模式的理解!在此,仅供参考! 单例:可以简单的理解是通过一个类,只能实例化单个对象,不能实例化 ...
- 从一个实例,一窥docker进程管理
在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...
- 如何聚焦自己的研究方向?一个实例研究
如何聚焦自己的研究方向?一个实例研究 文章目录 如何聚焦自己的研究方向?一个实例研究 目标人群 主讲人介绍 平台 内容 Part I: 如何看到领域内文献的Overview? Part II: 如何专 ...
- 只运行一个实例的方法
在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...
最新文章
- nyoj——297(期望)
- CatalanStirling数
- spring中的Aware
- python set()的用法
- Cmd使用方式--命令行运行程序
- fiddler自动保存mysql_Fiddler模拟自动响应数据
- 【数据结构与算法】之深入解析运用链表结构计算“两数相加”的算法实现
- SaaS CRM系统存在的五大安全漏洞
- 《软件项目管理(第二版)》第 6 章——项目质量管理 重点部分总结
- 信息学奥赛一本通 1141:删除单词后缀 | OpenJudge NOI 1.7 20
- c语言复杂函数转换,详解C语言常用的一些转换工具函数.pdf
- C++STL源码剖析之vector
- WEB前端开发快速入门教程
- 骑士人才linux伪静态,骑士CMS人才系统伪静态的设置方法
- HUAWER 华为5G无线数据终端 和 TP-LINK路由器AX6000连接及注意事项
- Tensorflow 释放内存
- java 30分钟_java 当前时间加减30分钟的时间
- Leetcode 312. 戳气球(经典区间dp)
- 第三章 μC/OS-Ⅱ中的任务
- python_dict_好玩游戏的物品清单