某次处理一个case,发现线上库里有很多数据有问题。于是决定写一个job来将有问题的数据软删除掉。涉及到的两条SQL语句如下:

<select id="loadTSKTVBillDailyFlowData" parameterClass="map" resultClass="tsKTVDailyFlowData">
/*+zebra:w*/SELECT ID,
DistributionDetailID,
PayPlanID,
FlowDirection
FROM TS_KTVBillDailyFlow WHERE FlowDirection != -1
GROUP BY DistributionDetailID
HAVING COUNT(DistributionDetailID)>1 LIMIT #pageSize#;
</select> <update id="updateTSKTVBillDailyFlowData" parameterClass="java.util.HashMap">
UPDATE TS_KTVBillDailyFlow
SET FlowDirection = -1
WHERE
<isNotEmpty property="distributionDetailIDList">
DistributionDetailID IN
<iterate property="distributionDetailIDList" open="(" close=")" conjunction=",">
#distributionDetailIDList[]#
</iterate>
</isNotEmpty>
AND payplanId=0
</update>

前面是选取出有问题的数据,后面是将有问题的数据进行软删除。

按照这两条SQL语句的思路写完程序之后上PPE环境测试,发现第一条select语句执行速度相当慢,平均每次花费3000ms-4000ms。原因在于group操作花费了大量时间。

经过权衡,决定从hive上拉取全部有问题的数据(第一条SQL),将数据放入txt,然后写一个job来读取txt,边读txt边进行update操作。

job主要代码如下:

public class CleanKTVBillDailyFlowBiz {

    private static final AvatarLogger logger = AvatarLoggerFactory.getLogger(CleanKTVBillDailyFlowBiz.class);
@Autowired
private PayPlanBillDao payPlanBillDao;
public void cleanData(){
InputStream is=this.getClass().getResourceAsStream("/DistributionDetailID.txt");
//InputStream is=当前类.class.getResourceAsStream("XX.config");
BufferedReader br=new BufferedReader(new InputStreamReader(is));
try {
String line = null;
String distributionDetailID = null;
List<String> distributionDetailIDList = new ArrayList<String>();
int i = 0;
while((line=br.readLine())!=null ){
distributionDetailID = line;
distributionDetailIDList.add(distributionDetailID);
i++;
if(i >= 500){
int rows = payPlanBillDao.updateTSKTVBillDailyFlowData(distributionDetailIDList);
logger.info(String.format("预期更新%d条,实际更新%d条", distributionDetailIDList.size(), rows));
i = 0;
distributionDetailIDList.clear();
}
}
//最后剩下不到500条单独处理
if(distributionDetailIDList.size() > 0){
int rows = payPlanBillDao.updateTSKTVBillDailyFlowData(distributionDetailIDList);
logger.info(String.format("预期更新%d条,实际更新%d条", distributionDetailIDList.size(), rows));
distributionDetailIDList.clear();
}
} catch (Exception e){
logger.error("Clean data exception", e);
}
}
}

DistributionDetailID.txt文件放在sources文件夹的根目录下,打成jar包之后位于jar包的根目录下,不能只用普通的读取文件的方式来读取txt文件的内容。

参考:http://blog.csdn.net/b_h_l/article/details/7767829

软删除脏数据job笔记的更多相关文章

  1. RookeyFrame 还原 软删除的数据 怎么硬删除 或者 怎么还原

     列表搜索栏上有个删除图标,可以进入回收站   如图:

  2. 数据的软删除-管理员的CRUD

    数据的“软删除”---把数据真正删除在某些时候会有问题.IsDeleted字段,false表示不删除,而是让用户可以看到,true表示是软删除,用户看不到. 一个表引用另外一张表的时候一定要引用主键. ...

  3. 深入理解 EF Core:使用查询过滤器实现数据软删除

    原文:https://bit.ly/2Cy3J5f 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能会去除一些本人实在不知道如何组织 ...

  4. tp5 model 中的软删除

    model中需use traits\model\SoftDelete; // 数据表中需添加一个 delete_time 字段保存删除时间 namespace app\index\model; use ...

  5. LindDotNetCore~ISoftDelete软删除接口

    回到目录 概念 ISoftDelete即软删除,数据在进行delete后不会从数据库清除,而只是标记一个状态,在业务范围里都不能获取到这个数据,这在ORM框架里还是比较容易实现的,对传统的ado来说需 ...

  6. Laravel5.1 模型 --软删除

    软删除是比较实用的一种删除手段,比如说 你有一本账 有一笔记录你觉得不对给删了 过了几天发现不应该删除,这时候软删除的目的就实现了 你可以找到已经被删除的数据进行操作 可以是还原也可以是真正的删除. ...

  7. thinkphp自动完成、软删除 和时间戳

    thinkphp自动完成.软删除 和时间戳 一.总结 自动完成:没有手动赋值的情况下进行手动处理 软删除:实现假删除,可以进行恢复 时间戳:系统支持自动写入创建和更新的时间戳字段 二.thinkphp ...

  8. ef core实现无感知软删除

    很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...

  9. ef core实现软删除

    很多web程序一般的偶不会设计真的物理删除了. 基本上都是在在数据库加一个标记,就得当作已经删除了.同时在查询的时候,过滤已经标记删除的数据 ef core实现软删除是非常简单的,直接在OnModel ...

随机推荐

  1. ASP.NET MVC 扩展HtmlHelper类方法

    1.扩展HtmlHelper类方法ShowPageNavigate 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  2. 【奶昔队ROUND#1】

    奶昔队Round #1 热身 (奶昔队不是真正的队,是群) CodeForces 435C Cardiogram 模拟,不过我做的时候不是模拟,是计算...(写了好久,还wa了几次),现在看了别人的代 ...

  3. 【转】eclipse导入V7包出现错误解决办法

    android下v4    v7   v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现 ...

  4. wamp中修改后mysq数据库l闪退无法登陆解决办法

    WampServer安装后密码是空的,   修改一般有三种方式:   一是通过phpMyAdmin直接修改:   二是使用WAMP的MySql控制台修改.     三是重置密码    第一种:   1 ...

  5. bzoj 3518 Dirichlet卷积

    详情见代码,回头再填坑... #include<iostream> #include<cstdio> #include<algorithm> #include< ...

  6. 【BZOJ-2502】清理雪道 有上下界的网络流(有下界的最小流)

    2502: 清理雪道 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 594  Solved: 318[Submit][Status][Discuss] ...

  7. jquery插件-表单验证插件-提示信息中文化与定制提示信息

    接上一篇 2)messages 提示:修改默认的提示信息最简单的方法是引入message_zh.js文件即可! 如果需要在validate()方法内提示则可以使用本选项 类型:Object 说明:自定 ...

  8. codevs1091 传染病控制

    题目描述 Description [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完 ...

  9. bios中只有windows boot manager下用U盘启动

    在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进 ...

  10. 组合数取模Lucas定理及快速幂取模

    组合数取模就是求的值,根据,和的取值范围不同,采取的方法也不一样. 下面,我们来看常见的两种取值情况(m.n在64位整数型范围内) (1)  , 此时较简单,在O(n2)可承受的情况下组合数的计算可以 ...