zoukankan      html  css  js  c++  java
  • 多线程导致事务失效-记一次性能优化

    优化背景:项目中有一个批量更新的方法,由于代码逻辑是逐个调用数据库进行更新,导致在更新数量多的情况下,整个方法执行慢。

    正常业务情况下,更新的数量能达到500个,假设更新一个耗时为100ms,那么500个需要的时间为50秒,用户肯定等不了那么久,需要优化。

    一开始想法是,开启多线程去更新,一个线程执行一个sql更新,我便动起手来,发现用多线程效果确实还可以,500个数据库更新耗时大概3秒。喜笑颜开。

    然而,后面分析这个改动会带来的影响是:

    原来这是一个事务方法,在使用多线程之后,那么这些批量更新就不在同一个事务了,那么可能存在某个线程中某个执行异常了,但是其他线程中的任务依然提交成功,就达不到事务的效果了。

    (事务状态基于threadlocal来保存,不同线程那么threadlocal则不同)

    那么如果解决上面遇到的问题呢?

    刚开始想到两个方法:

    方法一 : 让这些线程共用同一个事务,那么则需要自定义一个事务管理器,(这个个人感觉比较麻烦),只是有这个想法,还未去实现。

    方法二:让这500个sql更新操作,变成一个批量更新的sql,减少网络传输的耗时。

    最终使用了方法二,优化执行效率同时也保证了事务。

  • 相关阅读:
    Java查找指定文件中指定字符的个数
    推荐系统(CTR领域)实战入门指南
    xgboost 实践
    pandas 获取列名
    pandas 标签映射成数值的几种方法
    pandas 删除列
    pandas 聚合求和等操作
    dataframe检查重复值,去重
    linux 解压缩文件(tar和zip)
    kaggle——Bag of Words Meets Bags of Popcorn(IMDB电影评论情感分类实践)
  • 原文地址:https://www.cnblogs.com/swave/p/12084771.html
Copyright © 2011-2022 走看看