问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java爬虫采用多线程,数据库连接多了就报异常

发布网友 发布时间:2022-05-01 09:28

我来回答

9个回答

懂视网 时间:2022-05-01 13:49

某需求需要处理千万级别的数据,按一定规则导出,生成txt或xml文件,单线程处理太慢,写了一个跑了看差不多要处理6~10个小时。想了想还是就用多线程来从数据库中limit不同的数据来进行处理,耗时控制在5分钟以内.相关逻辑为:

 1 //……其他代码
 2 int count = 10000000;//假设共1千万条数据需要读取
 3 int per = 50000;//每次处理5万条
 4 for (int i = 0 ; i < count/per ; i ++){ //创建1000/5=200个线程来处理数据
 5 //使用线程池来处理多线程
 6 ThreadPool.execute(new ProcessTask(i*per,per));
 7 }

8 //……其他代码 9 class ProcessTask implements Runnable{ 10 int beigin,num; 11 public ProcessTask(int begin,int num){ 12 this.begin = begin; 13 this.num = num; 14 } 15 @Overview 16 public void run (){ 17 //线程内容,读取数据 18 List<Data> userlist = XXXService.getDataByLimit(begin,num); 19 //……对读出来的数据进行处理 20 //……其他代码 21 } 22 }

可见,此处通过循环同时创建了200个线程,而这200个线程都需要读取数据库,测试环境下最大连接数设置的是20,此时数据库就容易报错,无法连接。

除了无法连接数据库以外,还可能会导致以下问题:

  • 短时间内大量占用服务器内存,导致卡顿,甚至OOM
  • 在线上环境此处大量占用必定引起其他项目的性能
  • 此接口恶意盗刷可能导致服务器直接宕机
  • 解决方案:

    对读取数据库操作进行sleep

     1 //……其他代码
     2 int count = 10000000;//假设共1千万条数据需要读取
     3 int per = 50000;//每次处理5万条
     4 for (int i = 0 ; i < count/per ; i ++){ //创建1000/5=200个线程来处理数据
     5 //使用线程池来处理多线程
     6 ThreadPool.execute(new ProcessTask(i*per,per,i));
     7 }
     8 //……其他代码
     9 class ProcessTask implements Runnable{
    10 int beigin,num;
    11 int i ;
    12 public ProcessTask(int begin,int num,int i ){
    13  this.begin = begin;
    14  this.num = num;
    15  this.i = i ;
    16  }
    17  @Overview
    18 public void run (){
    19 //线程内容,读取数据
    20 Thread.sleep(i*500);//可以改成更大的值
    21 List<Data> userlist = XXXService.getDataByLimit(begin,num);
    22 //……对读出来的数据进行处理
    23 //……其他代码
    24  }
    25 }

    这样处理后就可以分时的读取数据库,减少服务器的负担,但是时间会变长(sleep操作),200*0.5=100s,不过也是在可以接受的范围内。

     

    感觉好像也没多少技术含量……或者说把getDataByLimit方法设置成synchronizd就行了吧,如果是单独使用的情况下……

    <--EOF-->

     

    多线程读取数据库导致连接失败解决方案

    标签:

    热心网友 时间:2022-05-01 10:57

    可以通过测试对错误原因进行排查,如果连接少量时不出问题,那就是连接量超出了某一数值出现异常,可以查看数据库的链接上限,如果是连接上限原因,可以尝试上调上限或者降低连接数量

    热心网友 时间:2022-05-01 12:15

    1、数据库连接可以设置大一些,但是对性能会有影响
    2、建议用线程池,减少线程创建和销毁时消耗

    热心网友 时间:2022-05-01 13:50

    单机线程这么多没有实际意义吧,减少线程数,线程采用线程池
    尽量延缓获取数据库连接的时机,尽早释放数据库连接

    热心网友 时间:2022-05-01 15:41

    和线程池应该没关系,楼主这里应该是就是开启多个线程同时 长时间爬取,估计应该是有些线程存在并发问题,造成了线程死锁。可以用监控工具跟踪下。追问是java多线程的死锁还是数据库的,感觉两方面都有,有啥资料不

    追答JProfiler 跟踪看下吧

    热心网友 时间:2022-05-01 17:49

    用个connection pool嘛 dbcp

    热心网友 时间:2022-05-01 20:14

    那就控制一个连接数

    热心网友 时间:2022-05-01 22:55

    打酱油的,忽略!

    热心网友 时间:2022-05-02 01:53

    使用线程池技术,不需要建立这么多数据库连接追问工程已经写到一定的地步了,我是想,从数据库方面考虑,怎么能处理下,改个参数之类的

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    如何考电焊工证书和介绍 泰迪多大可以吃美毛粉 ...毛不是很密,长大后毛会密吗?假如不会有什么方法挽救? 吃美毛粉... 四个多月的泰迪需要吃美毛粉\'钙片\'营养膏之类的保健品吗?_百度知 ... 滚筒洗衣机需要安装洗衣机底座吗 关于电源o是开还是一是开(电源o是开还是一是开) 我帮单位运输柴油80升用铁桶装的,当时无证明,我不是车主,消防队查获交... 右脚脚脖子处起三个疙瘩很痒很痛 我的脚脖有几个像是蚊子咬的疙瘩,很痒 怎么做采购 同居暧昧大结局视频 色彩如何才才能色调统一 同居暧昧游戏里的那个紫色头发的女孩叫什么名字? 穿绑带高跟鞋拍照的孟美岐有没有惊艳到你? 孟美岐开口就招黑,自曝辛苦每天睡半小时,过度营销有什么好处? 孟美岐商演不开美颜拍照,原相机下五官怎么样? 水粉颜色总是画脏,颜色也调不好看,什么是色彩统一,怎么统一 - 信息提示 画色彩静物色调的统一是什么?怎样才能做到色调统一? 设计色彩如何做到既统一又多样? 孟美岐的风评越来越差,是她自身原因还是粉丝招黑? 孟美岐时尚资源不断,你觉得她哪些高定造型比较好看? 孟美岐生图被曝光,跟精修图没有过区别,娱乐圈还有哪些颜值抗打的明星? 320x240分辨率的视频 大概是在什么年代拍出来的? 手机2.36寸的屏幕,320X240的分辨率 清晰不? 屏幕分辨率是320X240像素 手机分辨率320 x 240是多少像素? 手机320*240像素的分辨率高吗 我的话费积分是多少? 中国移动的手机积分是怎样计算的? 房间的颜色是不是要全部一致 净洁水写的同居暧昧在哪个小说阅读器里下载 画色彩怎样才能色调统一? 画色彩怎么让色调统一,还有怎么塑造。。求大神 类似同居暧昧的游戏有哪些 水粉画中什么是色调统一 色彩的高级灰怎样调,怎样用?怎样才能将一幅色彩的色调统一? 色彩绘画。如何才能让调色变得又快又准。如何做到统一色调。 张艺涵 和 张亿晗这两个名字哪个好 我朋友叫张亦晗我想祝她生日快乐怎么祝贺啊 炒萝卜辣的怎么炒好吃 2013蛇年11月8日15:30出生张姓女孩名字 新型墙体材料有哪些 wordpress模板安装教程哪里有下载? 女孩,父亲性张,09年7月8日出生起什么名字好那 美味辣萝卜怎么做好吃 wordpress网站模版哪里可以下载? 辣萝卜粉条怎么炒好吃 劳力士北京的售后中心在哪里? 港股代码怎么查询?