首页

文章

高并发 数据库连接失败 怎么解决

发布网友 发布时间:2022-04-20 04:36

我来回答

2个回答

懂视网 时间: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

    由于client发起tcp syn握手后,等待server发送tcp syn ack应答.但是如果server连接数过多等,会无法应答. client会等待3秒后重新发送tcp syn请求建立连接.这下明晰了.

    解决方法当然不是简单的增大那两个值.如果可以用线程池当然最好,但是如果使用无法提供线程池的语言,比如php,就只能暂时加大参数,提高处理速度了.
    八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 高并发的MySQL数据查询时,会不会选择数据库连接池? 求一二篇大一新生竞选院学生会主席的演讲稿 初中学生会竞选 主席或学习部 好的演讲稿 学生会组长竞选演讲稿 学生会竞选演讲稿(竞选办公室主任)要快急用 竞选学生会干部的演讲稿怎样写? 求高中学生会主席竞选演讲 求竞选学生会主席的演讲稿!!! 竞选学生会副主席3分钟演讲 大学生学生会竞选主席的演讲稿,要求(字数在500-6... 学生会主席竞选演讲怎么写 竞选学生会主席演讲稿 简短 学生会竞选主席,我要竞选主席,上台应该怎么说。 微信辅助解封一年三次是从解封那天算还是按年份计算 传奇的快捷键都有那些? 传奇私服整理的快捷键是? 传奇大背包用不了 热血传奇快捷键有哪些? 传奇的快捷键都有哪些? 《传奇》把包裹里隐藏的物品刷新出来的快捷键是什么? 数据库访问层如何优化实现高并发? 大数据量高并发访问数据库结构的设计 关于MySQL高并发处理机制是如何实现 高并发下,数据库成最大问题怎么办 高并发性的数据库操作-Mysql 哪些数据库支持高并发 如何写哟个高并发的数据库连接池 hibernate高并发如何处理,或者java开发中没有使用... 如何使用mysql数据库解决高并发 面试Java开发时问到高并发怎么处理的,还有sql优化... 如何利用MySQL来处理大数据高并发请求网站? 怎么提高数据库高峰时访问的并发能力 java多用户同时访问和数据库进行交互,如何能够高... java 高并发大量采集数据该如何去做 高并发下数据库插入重复数据,有什么好方法 南大通用的GBase8s数据库如何实现高并发的OLTP业务... 抗疫精神指的是什么? 抗疫体现了哪些中国精神? 防疫战体现了怎样的中国精神? 疫情中体现的中国精神
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com