当前位置: 首页 > news >正文

spring boot + mybatis 使用线程池异步修改数据库数据

在Spring Boot + Mybatis中使用线程池实现多线程异步修改数据库数据并避免Session关闭问题,需结合线程池管理、事务控制及SqlSession生命周期管理。在多线程环境下,每个线程需要独立的SqlSession,因为SqlSession不是线程安全的。以下是具体方案及最佳实践:

1. 线程池配置与异步执行

  • 线程池配置:通过ThreadPoolTaskExecutor配置线程池,设置核心参数:
    @Configuration
    @EnableAsync
    public class ThreadPoolConfig {@Bean("taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(10); // 核心线程数executor.setMaxPoolSize(20);  // 最大线程数executor.setQueueCapacity(200); // 任务队列容量executor.setThreadNamePrefix("AsyncDB-");executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略executor.initialize();return executor;}
    }

    • 使用@EnableAsync启用异步支持,避免Executors直接创建线程池(防止OOM)。
  • 异步方法声明:在Service层使用@Async注解标记异步方法:
    @Service
    public class UserService {@Async("taskExecutor")@Transactional // 事务管理public void asyncUpdateUser(User user) {// 数据库操作逻辑}
    }

2. 事务管理与SqlSession生命周期

  • 事务上下文传播:由于@Async方法在独立线程运行,需显式声明事务。关键点
    • 在异步方法上直接使用@Transactional,确保事务绑定到当前线程。
    • 避免跨线程共享SqlSession,通过SqlSessionFactory为每个线程创建独立Session:
      @Service
      public class UserService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;@Async("taskExecutor")public void asyncUpdateUser(User user) {try (SqlSession session = sqlSessionFactory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);mapper.updateUser(user);session.commit(); // 提交事务} // 自动关闭session,释放连接}
      }
    • 使用try-with-resources确保SqlSession在操作后自动关闭,避免Session泄漏。

3. 连接池与数据源配置

  • POOLED数据源:在application.yml中配置连接池(如HikariCP),确保连接复用:
    mybatis:configuration:default-executor-type: REUSE # 复用Executor
    spring:datasource:url: jdbc:mysql://localhost:3306/db?useSSL=falseusername: rootpassword: passwordhikari:maximum-pool-size: 20 # 连接池大小与线程池匹配idle-timeout: 30000
    • 连接池大小需与线程池最大线程数协调,避免连接耗尽。

4. 异常处理与资源释放

  • 强制关闭机制:在finally块中显式关闭SqlSession,防止异常导致连接未释放:
    SqlSession session = null;
    try {session = sqlSessionFactory.openSession();// 执行数据库操作session.commit();
    } catch (Exception e) {session.rollback(); // 回滚事务
    } finally {if (session != null) session.close();
    }

  • 监控与调优:通过Spring Boot Actuator监控线程池和连接池状态:
    management:endpoints:web:exposure:include: metrics,threadpool
    • 动态调整线程池参数(如队列容量、最大线程数)以适应负载。

5. 最佳实践验证

  • 避免跨线程共享:确保每个线程使用独立的SqlSession,禁止在多线程间共享SqlSession实例。
  • 批量处理优化:对于高频异步任务,采用Mybatis批量操作(如<foreach>标签)减少数据库交互次数。
  • 日志跟踪:启用Mybatis日志(logging.level.org.mybatis=DEBUG),监控Session创建/关闭过程。

通过上述方案,可实现线程池驱动下的异步数据库操作,同时确保SqlSession生命周期管理严格遵循“按需创建、操作后关闭”原则,避免Session关闭导致的操作异常。实际开发中,建议结合监控工具(如Actuator)持续优化线程池和连接池配置,确保系统稳定高效运行。


文章转载自:

http://dsFrzs1e.Ltywr.cn
http://EBkWIDYs.Ltywr.cn
http://fbsEpzOt.Ltywr.cn
http://I4ArD1pZ.Ltywr.cn
http://NqCt76JP.Ltywr.cn
http://JlNwGf3o.Ltywr.cn
http://JVtlqRbL.Ltywr.cn
http://6LfFSBMs.Ltywr.cn
http://zMBFrys2.Ltywr.cn
http://T2VDD5gI.Ltywr.cn
http://upWnd3LI.Ltywr.cn
http://jpVTf7K4.Ltywr.cn
http://CIk6VLyZ.Ltywr.cn
http://5ttobpXx.Ltywr.cn
http://FjO1QJtX.Ltywr.cn
http://totPr35W.Ltywr.cn
http://EjUaBSBw.Ltywr.cn
http://hh1Sw2UL.Ltywr.cn
http://ddNxZeZb.Ltywr.cn
http://WrVqWJWL.Ltywr.cn
http://KLCj2nUD.Ltywr.cn
http://gbFAfdQT.Ltywr.cn
http://3GL4Xvwt.Ltywr.cn
http://CintcCnq.Ltywr.cn
http://Ll5gwM0v.Ltywr.cn
http://cQNJlfl0.Ltywr.cn
http://6pu2lCf0.Ltywr.cn
http://34Xz0LQp.Ltywr.cn
http://tWQPj67a.Ltywr.cn
http://savYixbv.Ltywr.cn
http://www.dtcms.com/a/370656.html

相关文章:

  • redission实现读写锁的原理
  • 室内植物光照初学者指南
  • Redisson分布式锁:看门狗机制与续期原理
  • OSG工具集
  • CC内存管理深度解析从内存布局到newdelete的底层实现
  • 让机器具有主动性-主动性算法[01]
  • PagedAttention:突破大语言模型内存瓶颈的分页式注意力革命
  • Qt 中的 Q_OBJECT 宏详解 —— 从源码到底层机制的全面剖析
  • 正态分布 - 计算 Z-Score 的 无偏估计
  • 【基础-单选】用哪一种装饰器修饰的struct表示该结构体具有组件化能力?
  • 【LeetCode 每日一题】2348. 全 0 子数组的数目
  • 《2025国赛/高教杯》C题 解题思路 NIPT的时点选择与胎儿的异常判定
  • vspere 服务的部署介绍
  • 基本数据类型和包装类的区别?
  • 《AC影》正史模式引争议 育碧回应希望激发历史兴趣
  • leetcode30.串联所有单词的子串
  • QML Charts组件之LineSeries、SplineSeries与ScatterSeries
  • browser-use 的三种启动方式详解
  • Qt对话框与文件操作学习
  • Linux文件管理器选择与推荐
  • 接雨水问题解析:双指针与单调栈解法
  • Kafka Exactly-Once 语义深度解析与性能优化实践指南
  • spring-ai-alibaba-deepresearch 学习(十三)——ResearcherNode
  • 2、数学与经济管理
  • 使用 Shell 脚本监控服务器 IOWait 并发送邮件告警
  • Python数据可视化科技图表绘制系列教程(六)
  • [Upscayl图像增强] docs | 前端 | Electron工具(web->app)
  • 同态加密库(Google FHE)
  • Qt自定义列表项与QListWidget学习
  • MySQL 高可用方案之 MHA 架构搭建与实践