工作日志0214:执行慢而大保证数据不丢失策略

序言

最近需要做一个db to db的东西,总数据量三千万左右,我们需要将一个或者多个库中的表导出为Sql或者将一个或者多个sql文件导入到任意库。在这个过程中,我使用了多线程。(Python效率一言难尽)。那是必须要使用线程池的,但是执行一个sql文件或者导出如果耗时巨多,然后我们表又很多,会造成前面任务执行不完,后面任务有丢失的情况,所以我新定了一个策略,阻塞策略。意思就是如果有new Task ,那么线程池会等着处理完现在的任务再去处理他,再这过程中,不会有任务丢失。但是生产所带来的内存开销和资源交互开销是无法释放的(后面再谈解决方案)。

解决

重写RejectedExecutionHandler拒绝策略,代码如下:

/**
 * block the queue when it is full
 * @author Herche Jane
 */
public class BlockExecutionHandler implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        try {
            executor.getQueue().put(r);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

阻塞拒绝策略

结束语

虽然这个策略暂时缓和了燃眉之急,但是似乎引发了内存问题(待解决和寻找根源)。请谨慎使用!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值