这两天报过来个bug,和大家讨论了解决方案后,觉得这正是SRP一个广义上的实例,值得记录一下。

先讲一下业务情况:

数据库中有一些存储过程,目的是生成报表数据。应用服务器上有一个Java写的Timer,定期(通常是一周,一月或一年末)调用这些存储过程,更新报表数据。这些存储过程中任何一个都能被顺序执行任意多次而不会出错,但如果同一个存储过程的两个实例并发执行会产生错误结果。

先前的处理方法基于以下两个考虑:

1)需要一个统一框架控制并发问题,不用在每个存储过程内部考虑并发问题。

2)出现意外情况时,系统能够自动恢复。这样不会在半夜两点钟被电话叫醒去修BUG。

基于以上的考虑,Java端Timer实现以下:

// Reset all flags when the scheduler restart
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)相关推荐

  1. 限制程序只打开一个实例(转载)

    当我们在做一些管理平台类的程序(比如Windows的任务管理器)时,往往需要限制程序只能打开一个实例.解决这个问题的大致思路很简单,无非是在程序打开的时候判断一下是否有与自己相同的进程开着,如果有,则 ...

  2. 众所周知,static修饰的成员只实例化一次,而string类型每次赋值都会重新创建一个实例,那么用static修饰string呢?...

    string 类型每次实例化都会重新创建一个实例: 解释:string 类型重载了运算符 "=" ,每次 "=" 操作都是一次 "new". ...

  3. ​iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景.

    2019独角兽企业重金招聘Python工程师标准>>> 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机制分两块,(1)首先在 ...

  4. docker 主进程 日志_[docker]从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

  5. 让Java程序只运行一个实例

    一个程序可以在内存里面存在多个运行实例,比如,你可以打开多个微软的Word程序.但是,有些时候我们需要控制程序运行的实例只有一个,也就是说,该程序同一时刻在内存里面运行的只有一个实例.这样当这个程序在 ...

  6. php单例模式的实例,PHP的单例模式的一个实例_php

    这篇文章对于php单例模式的解释并不一定完善!只是举一个实例而已,目的是让我自己通过一个实例可以加深对单例模式的理解!在此,仅供参考! 单例:可以简单的理解是通过一个类,只能实例化单个对象,不能实例化 ...

  7. 从一个实例,一窥docker进程管理

    在Docker中,进程管理的基础是Linux内核的PID命名空间技术.在不同的PID命名空间下,可以有相同的PID. Linux内核为所有的PID命名空间维护了一个树状的数据结构,最顶层是系统初始化时 ...

  8. 如何聚焦自己的研究方向?一个实例研究

    如何聚焦自己的研究方向?一个实例研究 文章目录 如何聚焦自己的研究方向?一个实例研究 目标人群 主讲人介绍 平台 内容 Part I: 如何看到领域内文献的Overview? Part II: 如何专 ...

  9. 只运行一个实例的方法

    在VC++ 中编程中,只运行一个实例的方法主要有两类: 1 遍历当前的所有窗口,查找相同的实例.为了便于查找,一般要事先设一个查找标志. 2 利用系统提供的互斥对象或信标,直接让系统抑制重复的实例. ...

最新文章

  1. nyoj——297(期望)
  2. CatalanStirling数
  3. spring中的Aware
  4. python set()的用法
  5. Cmd使用方式--命令行运行程序
  6. fiddler自动保存mysql_Fiddler模拟自动响应数据
  7. 【数据结构与算法】之深入解析运用链表结构计算“两数相加”的算法实现
  8. SaaS CRM系统存在的五大安全漏洞
  9. 《软件项目管理(第二版)》第 6 章——项目质量管理 重点部分总结
  10. 信息学奥赛一本通 1141:删除单词后缀 | OpenJudge NOI 1.7 20
  11. c语言复杂函数转换,详解C语言常用的一些转换工具函数.pdf
  12. C++STL源码剖析之vector
  13. WEB前端开发快速入门教程
  14. 骑士人才linux伪静态,骑士CMS人才系统伪静态的设置方法
  15. HUAWER 华为5G无线数据终端 和 TP-LINK路由器AX6000连接及注意事项
  16. Tensorflow 释放内存
  17. java 30分钟_java 当前时间加减30分钟的时间
  18. Leetcode 312. 戳气球(经典区间dp)
  19. 第三章 μC/OS-Ⅱ中的任务
  20. python_dict_好玩游戏的物品清单

热门文章

  1. elasticsearch下载与安装
  2. python输入年份输出年历_python打印万年历
  3. Appium安装及环境部署
  4. freopen函数详解
  5. 恶搞关机代码,可以发给你的同学
  6. 智力竞赛抢答器 Verilog HDL 建模
  7. python turtle库一些基本函数
  8. Mysql ERROR 1067: Invalid default value for ‘date’ 解决
  9. Android多线程编程(一)- 线程基础
  10. 程序员怎么悄无声息迈过36岁大槛?