某次处理一个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. Java多线程与并发库高级应用-同步集合

    ArrayBlockingQueue LinkedBlockingQueue 数组是连续的一片内存 链表是不连续的一片内存  传统方式下用Collections工具类提供的synchronizedCo ...

  2. Input path does not exist: file:/.......

    注意看是file不存在并不是hdfs,好奇怪,突然明白应该是路径不对,必须加上hdfs://hostname:port/file. 我为什么饭这样的错误是因为前一阵谢了HDFS的曹组,谢了全局File ...

  3. 【poj3084】 Panic Room

    http://poj.org/problem?id=3084 (题目链接) 题意 一个房子里面有m个房间,一些房间之间有门相连,而门的开关只在一个房间有,也就是说只有一个房间可以控制该扇门的开关.现在 ...

  4. hdu 5237 二进制

    很无聊的模拟题...mark几个有用的小程序: 字符->二进制ASCII码 string tobin(char c) { string t; ; i<; i++) { t=+)+t; c/ ...

  5. 服务器添加ipa MIME 类型,防止ipa下载后变zip后缀

    客户反映apk文件下载 后缀会变为zip   打开mime.types文件   application/iphone pxl ipa application/vnd.android.package-a ...

  6. C#把数据写到硬盘指定位置

    FileStream fs; StreamWriter sw;string RootPath = @"C:\Advantech" + "\\tempData\\" ...

  7. Unity 单例写法

    借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类 ...

  8. POJ #2448 A New Operating System

    Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 1165   Accepted: 110 Case Time Limit: ...

  9. POJ 2785 4 Values whose Sum is 0(想法题)

    传送门 4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 20334   A ...

  10. spring 初始化之后执行的方法

    Spring初始化完成后直接执行一个方法,初始化数据(解决方法并执行两次) 在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听.Servlet加载初始化等切入点为数据库准备数据,这些初始化数 ...