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

java多线程连接数据库问题

发布网友 发布时间:2022-04-09 08:31

我来回答

4个回答

懂视网 时间:2022-04-09 12:52

某需求需要处理千万级别的数据,按一定规则导出,生成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-04-09 10:00

    是的。肯定要每次都连接数据库,简单点
    你可以把连接数据库写成一个类中的方法,到run()线程的时候,创建类的对象,再调用就好了。

    热心网友 时间:2022-04-09 11:18

    似的,main也是一个线程,第一个被执行,执行之后其空间被释放,然后执行其他线程,因此必须在每个线程中连接数据库

    热心网友 时间:2022-04-09 12:53

    把代码弄上来看看、、、没怎么明白
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    网络宣传文案心碎,句句获赞! 关于朋友圈上万人点赞转发的说说 人生看的很透彻的经典句子 超现实超扎心的说说大全2019最新 心脏血管堵塞吃什么食物 投资理财有什么前景 pp理财什么情况 P2P理财行业的前景如何? 中国目前的财富管理现状是什么情况? 呼吸皮沙发寿命多久 “皮沙发的呼吸寿命” 呼吸皮沙发寿命多久 召字旁一个力怎么读? 流清水鼻涕妙招用姜 唯我手机怎样取消互传? aak拉链与ykk的区别 10月4日唯我手机怎样隐藏应用? 唯我手机为什么关机这么难? 感冒流鼻涕应该打点什么药水 没有登录过id.qq.com,为什么QQ会有这个的登录记录? 唯我s7手机怎么样? sbs拉链和ykk拉链有什么区别呢 大学生科研立项,有关pm2.5的研究方向有哪些 中国的美术家有哪些 高考美术加多少分 学美术高考现在能不能加分?一般能加多少? - 信息提示 有几台液晶电视机在一起,要怎样连,才能看同一个电视剧 美术加文化的综合分怎么算? 美术加教育能否等同于美术教育,并论述 如何将多个液晶显示器拼装在一起当一台显示器用? 夏天为什么要穿吊带打底衫或者吊带打底裙? sab拉链和ykk哪个好 &quot;召&quot;右边一个&quot;力&quot;读什么 征途怀旧版自己开6个号如何能最快的升级,骨灰级玩家进来指点 vivo怎么读,是一个手机牌子。 QQ安全中心提示异常登陆,且不是本人登陆的,因为在异地,而且登陆方式为id.qq.com登陆 “召”和“力”组成的字念什么? 拉链和拉链连在一起怎么分开? 在唯我手机怎么查玩游戏时间? 激活辅助帐号弹出这个是怎么回事 由于网络问题,激活没有成功,您可以尝试先登录id.qq.com, 再激活链接 召字旁一个力 念啥 拉链和邮政是什么意思? 唯我Y927怎么设置屏幕旋转啊。通知栏里面什么都没有,而且设置里面也没有显示,怎么办啊 左边一个召右边一个力叫什么字 怎么才能止住孩子流鼻涕 鼻子一年四季都会流鼻涕打喷嚏,看过医生说是鼻子敏感,拿了喷鼻的药水和药,好了一段时间又会发作,而且 qq最近总提示异地登陆,还有在id.qq.com查看个人隐私,怎麽改密码都不行,到底是咋回事啊 召旁边加个力怎么读 打喷嚏滴什么药水好 口加戾读什么,戾的读音,戾的读音,召加力读什么 我的QQ中心 动态怎么屏蔽? http:&#47;&#47;id.qq.com 我改了资料,不想让人从 我的QQ中心,看到改动,要怎么屏蔽?