码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • dynamic-datasource + parallelStream数据源切换失效


    记录一次使用动态数据源+java8的ParallelStream并行流导致的数据源切换失效问题,先看一下异常记录:

    代码如下:

    1. @Service
    2. @DS(DataSourceConst.ORDER)
    3. public class OrderService {
    4. @Resource
    5. private VendorService vendorService;
    6. public void getVendor() {
    7. vendorService.getVendorInfo(Arrays.asList(1L));
    8. }
    9. }
    1. @Service
    2. @DS(DataSourceConst.VENDOR)
    3. public class VendorService {
    4. @Resource
    5. private VendorInfoRepository vendorInfoRepository;
    6. public List getVendorInfo(List vendorIdList) {
    7. List> partition = Lists.partition(vendorIdList, 500);
    8. return partition.parallelStream().flatMap(idList -> {
    9. LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
    10. .in(VendorInfo::getId, idList);
    11. return vendorInfoRepository.select(wrapper).stream();
    12. }).collect(toList());
    13. }
    14. }

    分析问题:因为dynamic-datasource是通过AOP的方式,在调用方法前切换数据源的,而java8的ParallelStream需要新开线程,这些新的线程是独立于原来的线程的,原来线程中的数据源切换并不能传递到新的线程中,这就可能导致在新的线程中对数据库的操作还是使用的原来线程的数据源,不能正确地进行数据源切换。

    解决问题:把@DS放在方法上,代码如下:

    1. @Service
    2. @DS(DataSourceConst.VENDOR)
    3. public class VendorService {
    4. @Resource
    5. private VendorInfoRepository vendorInfoRepository;
    6. @DS(DataSourceConst.VENDOR)
    7. public List getVendorInfo(List vendorIdList) {
    8. List> partition = Lists.partition(vendorIdList, 500);
    9. return partition.parallelStream().flatMap(idList -> {
    10. LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
    11. .in(VendorInfo::getId, idList);
    12. return vendorInfoRepository.select(wrapper).stream();
    13. }).collect(toList());
    14. }
    15. }

    以上是问题的一次简单记录,并为深挖如有不对的地方请评论指导。

  • 相关阅读:
    mac建议装双系统吗,详细分析苹果电脑双系统的利弊
    linux tr 删除空行
    Cesium加载离线地图和离线地形
    定向模糊测试aflgo中的能量调度
    数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)
    解决“本地计算机上的 mysql 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止”
    Elastic 发布 Elasticsearch Relevance Engine™ — 为 AI 革命提供高级搜索能力
    为什么不让用join?《死磕MySQL系列 十六》
    正则表达式校验版本号
    飞思卡尔 S12 (X)串口下载移植
  • 原文地址:https://blog.csdn.net/itxiaobaishu/article/details/133341303
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号