SpringBoot Test 多线程报错的根本原因(dataSource already closed)

背景

使用Springboot test进行相关测试的时候,发现开启线程操作数据库的时候异常。

排查方法

将线程移除,采用并行的方式,操作数据库正常。

根本原因

  • SpringBoot Test 主线程退出,导致Spring 容器关闭。
  • Spring容器关闭,导致DruidDataSource 关闭
  • 此时用户线程去访问已关闭的数据源,导致报错。

解决方法

提供一个全局的线程池,然后使用线程池开启线程操作,然后添加监听器,监听线程池里面是否有未完成的任务,如果有则不关闭容器。

@Component
public class EventListener implements ApplicationListener<ApplicationEvent> {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextClosedEvent) {
            LoggerClient.info("容器即将关闭");
            //线程池工具类
            ThreadPoolUtil threadPoolUtil = new ThreadPoolUtil();
            while (threadPoolUtil.getExecutor().isTerminated()) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
​public class ThreadPoolUtil {
    private static final ExecutorService executor = Executors.newFixedThreadPool(20);
    public ThreadPoolUtil() {
    }
    public ExecutorService getExecutor() {
        return executor;
    }
    public static void submitRunnable(Runnable runnable) {
        executor.submit(runnable);
    }
    public static <V> Future submitCallable(Callable<V> callable) {
        Future<V> submit = executor.submit(callable);
        return submit;
    }
}

到此这篇关于SpringBoot Test 多线程报错:dataSource already closed的文章就介绍到这了,更多相关SpringBoot Test 多线程报错内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决SpringBoot运行Test时报错:SpringBoot Unable to find

    目录 SpringBoot运行Test时报错 错误详情 解决办法 SpringBootTest单元测试报错 SpringBoot运行Test时报错 运行Test时的报错信息:SpringBoot Unable to find a @SpringBootConfiguration 错误详情 今天做SpringBoot配置邮件发送的时候,运行测试类,报如下错误: 说找不到@SpringBootConfiguration注解,其实是有的,检查了下启动类和被测试类的细节,都没问题,查询的很多CSDN答案

  • SpringBootTest单元测试报错的解决方案

    目录 SpringBootTest单元测试报错 单元测试 @mock和@SpringBootTest使用 一.单元测试工具mock使用 二.springboot使用@SpringBootTest单元测试 三.mock和@springBootTest区别 SpringBootTest单元测试报错 @RunWith(SpringRunner.class) @SpringBootTest(classes = { DataRulesApplication.class }) @EnableAutoConf

  • springboot中pom.xml文件注入test测试依赖时报错的解决

    目录 pom.xml文件注入test测试依赖时报错 分析原因 解决方法 springboot中pom.xml之间的依赖 依赖关系 所用到的技术 talkischeap,详见配置文件 pom.xml文件注入test测试依赖时报错 报错:Failed to read artifact descriptor for org.springframework.boot:spring-boot-starter-test:jar:2.0.4.RELEASE 分析原因 有可能是默认版本太高 解决方法 降低版本

  • SpringBoot Test 多线程报错的根本原因(dataSource already closed)

    背景 使用Springboot test进行相关测试的时候,发现开启线程操作数据库的时候异常. 排查方法 将线程移除,采用并行的方式,操作数据库正常. 根本原因 SpringBoot Test 主线程退出,导致Spring 容器关闭. Spring容器关闭,导致DruidDataSource 关闭 此时用户线程去访问已关闭的数据源,导致报错. 解决方法 提供一个全局的线程池,然后使用线程池开启线程操作,然后添加监听器,监听线程池里面是否有未完成的任务,如果有则不关闭容器. @Component

  • idea中springboot项目连接数据库报错的原因解析

    一.我在运用mybatis下报错,反复检查无逻辑问题,下图为项目结构截图 二.最后总结问题如下: 1)报错代码: Caused by: java.lang.RuntimeException: Failed to load driver class com.mysql.cj.jdbc.Driver in either of HikariConfig class loader or Thread context classloader at com.zaxxer.hikari.HikariConfi

  • SpringBoot集成MybatisPlus报错的解决方案

    这篇文章主要介绍了SpringBoot集成MybatisPlus报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class 解决方案 需要一个mybatis-spring-boot-starter的包,在pom文件加上之后,完

  • 解决python多线程报错:AttributeError: Can't pickle local object问题

    报错信息: Traceback (most recent call last): File "D:/flaskProject/test.py", line 35, in test pool.apply(self.out, args=(i,)) File "Python37-32\lib\multiprocessing\pool.py", line 261, in apply return self.apply_async(func, args, kwds).get(

  • springBoot集成Elasticsearch 报错 Health check failed的解决

    springBoot集成Elasticsearch 报错 Health check failed 今天集成Elasticsearch 时启动报错 报错信息如下: 2018-11-01 20:52:51.310 INFO [hstao-supersearch,,,] 8528 --- [ main] .s.c.n.e.s.EurekaAutoServiceRegistration : Updating port to 8009 2018-11-01 20:52:51.314 INFO [hstao

  • SpringBoot启动yaml报错的解决

    SpringBoot启动yaml报错 报错找不到org.yaml里的一个方法 10:45:54.742 [main] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.NoSuchMethodError: org.yaml.snakeyaml.nodes.ScalarNode.getScalarStyle()Lorg/yaml/snakeyaml/DumperOptions$Sc

  • 解决SpringBoot中@Email报错问题

    JSR303校验相关 现象:在springboot中使用@Email注解进行数据校验时,报没有该注解的错误. 解决方法: 在pom.xml中加该配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 测试成功 ==测试成功== ![i

  • SpringBoot整合thymeleaf 报错的解决方案

    近日 在springboot项目中使用thymeleaf时,莫名报了以下错误: 在网上查找文章明白了报错的原因,这是由于如果使用thymeleaf 为模板,那么解析时就要求html必须为严格的html5格式,即必须有完整的结束标记, 不然就会报错. 在html页面中,诸如input,meta,link等标签 ,是可以不用闭合就可以被解析的(自闭合的),但是由于这里严格要求html5格式 于是解决办法如下: 1) 在报错的标签上加入 结束标签. 2) 修改为不严格的模式. 在配置文件中加入如下配置

  • 解决springboot服务启动报错:Unable to start embedded contain

    目录 1. 根据报错信息发现是在刷新容器的方法onRefresh中抛出的 2. 接着被捕获异常的方法源码 3. 再接着就是抛出异常的根源所在的源码 4. 知道原因了反过去查看代码发现启动类中少写了注解 5. 还有一种情况需要注意 初次接触spring-boot + spring-cloud构建微服务项目,配置好项目后并选择启动类启动时报如下错误: [main] ERROR org.springframework.boot.SpringApplication - Application start

  • SpringBoot Maven Clean报错解决方案

    报错信息: Plugin org.apache.maven.plugins:maven-clean-plugin:3.0.0 or one of its dependencies could not be resolved 解决方法: 修改pom.xml下: <version>0.0.1-SNAPSHOT</version> 为 <version>0.0.1</version> 另附: 可能Problem窗体下回给出错误提示(警告不用管),直接右键删除即可,

随机推荐