开发者社区> 问答> 正文

JAVA利用多线程实现批量插入数据时,tomcat会卡死掉:报错

各位大神好!我利用JAVA的多线程实现读取 xsl 文件并在读取完一行之后就插入数据库时,发现TOMCAT经常会卡死,之后就查看TOMCAT ,发现tomcat里面有很多空闲的线程没有结束,有大神知道怎么回事吗?

以下是部分代码 

List<PredictOrderRow> rowList = excelUtil.getData();

for(int i=1;i<=rowList.size();i++) {

ExecutorService exec = Executors.newFixedThreadPool(rowList.size())

exec.submit(new PredictwaybillEX(i,columns,opId))

}

exec.shutdown()







展开
收起
kun坤 2020-06-07 14:10:45 1590 0
1 条回答
写回答
取消 提交回答
  • ExecutorService exec = Executors.newFixedThreadPool(rowList.size())

    放到FOR 的外边去,,  线程池 一个就行了



    ######正解,几万行的话会有几万个线程池。神也扛不住啊。######1你代码exec作用范围错了 2你这样写估计都没有批量提交效率高,同时数据库链接容易堵塞。 3建议你用一个线程读取excel一定数量后放到集合里,另外一个线程从集合里取出一定量的数据然后提交数据到数据库######是等待线程吧 ######

    第一, 创建线程池为什么在for循环里面?  你现在的代码如果xsl里面有100条数据,那么将会创建100*100=10000个线程。。。oh my god!

    第二, 并不是说有多少条数据就要创建多少个线程,如果xsl里面有10000条数据,难不成要创建10000个线程?  所以你这里线程池里线程个数不要太大,我觉得10个就够了吧

    ######回复 @找点钱过日子 : 根据实际情况来考虑线程池的大小,比如xsl里的文件平均有多少条数据,系统的配置如何等。 一般来说线程越多,同时处理的数据就越多,总的处理时间会断,但是也会带来CPU利用率的提高和JVM内存占用提高,负荷增大。######那线程池的大小应该设为多少比较好合适呢?######

    线程池就是用来解决短线程过多的问题。一个线程完成了一项任务后,重新放回线程池,等待执行新的任务。

    ######不死才怪######

    ExecutorService exec = Executors.newFixedThreadPool(rowList.size()) 行上,alt+↑

    同时,把rowList.size()改成固定数字,10或20就行了。


    ######CPU核数*2######学习了######

    主线程调用 CountDownLatch doneSignal = new CountDownLatch(rowList.size());

    子线程里边sql语句执行完成后调用doneSignal.countDown();

    主线程调下面方法,同步阻塞等待所有子线程都调用上面的countDown方法,设置超时时间5秒,防止主线程死等。

    doneSignal.await(5, TimeUnit.SECONDS);

    这样所有子线程都执行完成之后,主线程才会继续执行。

    2020-06-07 14:10:50
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
EXTENDING SPARK WITH JAVA AGENTS 立即下载
基于Java容器的多应用部署技术实践 立即下载
多IO线程优化版 立即下载