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

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

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

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

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

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

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

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

    刚开始想到两个方法:

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

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

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

  • 相关阅读:
    SpringMVC之@RequestParam @RequestBody @RequestHeader 等详解
    RabbitMQ基础介绍
    linux查看tomcat日志
    HTML-01
    Ajax和json
    使用VBScript实现设置系统环境变量的小程序
    WinForm中重绘TabControl选项卡标题
    Action向视图传值的6种方式
    C#中常用的系统内置委托
    C#中的扩展方法
  • 原文地址:https://www.cnblogs.com/swave/p/12084771.html
Copyright © 2011-2022 走看看