某次处理一个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. MyEclipse项目上有个感叹号

    如图: 然后把有叉的选项移除就可以了

  2. IE下实现PlaceHolder

    /* * jQuery placeholder, fix for IE6,7,8,9 * @author JENA * @since 20131115.1504 * @website ishere.c ...

  3. iOS黑客技术相关

    在黑客的世界里,没有坚不可破的防护系统,也没有无往不胜.所向披靡的入侵利器,有时候看似简单的问题,破解起来也许花上好几天.好几个月,有时候看似很 low 的工具往往能解决大问题:我们以实现微信自动抢红 ...

  4. Python 从零学起(纯基础) 笔记 (二)

    Day02 自学笔记  1.  对于Python,一切事物都是对象,对象基于类创建,对象具有的功能去类里找 name = ‘Young’       -   对象 Li1 = [11,22,33]   ...

  5. python3 连接SQLserver

    pymssql 是Python语言用来连接微软 SQL SERVER 数据库的类库,实现了 Python DB API 2.0 .官网介绍. 最简事例: #!/usr/bin/env python # ...

  6. 绘制图形与3D增强技巧(五)----多边形图元的使用及其他

    1.注意多边形图元中的多边形只能是平面的,而且必须为凸多边形,且多边形的边不能弯曲 2.细分和边界,可以人为设置边界边和非边界边 glEdgeFlag(true)//接下来所有点均为边界边起点 glE ...

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

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

  8. HDU2222 Keywords Search

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. hdu 5035 概率题

    直接推公式的题目了.... Refer:http://blog.csdn.net/u012139398/article/details/39458623 https://www.zybuluo.com ...

  10. 控件的invoke和beginInvoke方法

    System.Windows.Forms.Timer 的timer是在主线程上执行的,因此在timer的tick事件中操作界面上的控件不会发生线程的安全性检测. Control的invoke和begi ...