java解决高并发之数据库连接池配置

2023-10-28

     使用的IDE是IDEA ,项目是springboot框架的项目

 

       最近一直在处理高并发的问题,大致情况是这样的:大概有五六千人会在中午十二点同时访问网站,操作数据库,导致服务器崩溃。对于频繁修改数据的这种情况,例如:用户要抢商品,且抢完后要刷新看自己抢的商品,这会造成频繁的修改数据库和查询数据库,所以对于用数据库读写分离来说并不高效,因为这涉及到频繁的查询和修改数据库,而数据库的读写分离它需要一个数据共享的过程,比如说一个数据库用来读,一个数据库用来写,但是,用户登陆进去后,要抢商品,那就要写数据,写完后还要将写完的数据共享到读的那个数据库中去,这样用户返回刷新才能看到,这样就多此一举了,而且数据共享还需要一定的时间,这样就会导致用户刷新页面后看到自己还没有抢单成功,用户体验极不好,也会让用户产生怀疑。

      这个时候加redis缓存会更效,为什么这么说呢?用户登录进来后抢单,将数据写入缓存和数据库,当用户再刷新时,用户访问的就是redis缓存里的数据了,不用再去查数据库,这样就减少了数据库的连接,减轻了数据库的负担。

     最头疼的是,加了缓存后,还是一样的崩溃。这不由得让我想起mysql数据库连接数的问题。当产生高并发时,数据库的连接数是有限的,在使用了阿里的druid连接池后,也是一样的卡死,我先说我的解决方法:

       解决方法很简单,就是修改druid的活跃连接数,我之前设置的是20,改成8后,解决了高并发的问题。

    这是什么原因呢? 通过压力测试后,发现一个规律:连接池的最大活跃连接数是根据你的服务器的配置来确定的。我一台服务器是四核的,一台是单核的,当我在双核的服务器上项目里设置的活跃连接数是20时,高并发并没有问题,但是在单核的服务器上项目里设置活跃连接数20时就会崩溃。

       由此得出结论:你设置的连接池的活跃连接数是由你的服务器配置决定的。

       也通过实验,当你的并发量很高时,连接数越小,吞吐量就越高。

     我解决五六千的并发量就是这么解决的,并发量再往上如上万上百万千万的,那就需要用到集群分布式等技术了,但对于这种小并发量的操作没有必要用到这些技术,也会增加成本。配置连接池的maxActive,并不是这个数量越大越好,相反是越小越好,最好是根据你的服务器配置来。

     我的连接池配置如下(.yml文件):

datasource:
      url: jdbc:mysql://localhost:3306/cgcx?useUnicode=true&characterEncoding=utf-8&&autoReconnect=true&failOverReadOnly=false&useSSL=false
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
      platform: mysql
      type: com.alibaba.druid.pool.DruidDataSource
      # 下面为连接池的补充设置,应用到上面所有数据源中
      # 初始化大小,最小,最大
      initialSize: 1
      minIdle: 2
      maxActive: 8
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 30000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 30000
      validationQuery: select 'x'
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      # 打开PSCache,并且指定每个连接上PSCache的大小
      poolPreparedStatements: false
      maxPoolPreparedStatementPerConnectionSize: 20
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,slf4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
其实高并发这个问题还没有完全的解决方案,就连伟大的阿里巴巴淘宝也没有完全的解决,我们在双十一或双十二的时候,你花了好几天精心挑选的宝贝放在购物车里,到晚上十二点抢着付款那个时候,是不是点不动啊?哈哈哈哈!!!!
所以这个问题目前只能是尽量避免。并没有完全的解决方案。

希望能帮助到各位。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java解决高并发之数据库连接池配置 的相关文章

随机推荐

  • SDH概述

    1 SDH概述 1 1 SDH产生的技术背景 为什么会产生SDH传输体制 在讲SDH传输体制之前 我们首先要搞清楚SDH到底是什么 那么SDH是什么呢 SDH全称叫做同步数字传输体制 由此可见SDH是一种传输的体制 协议 就像PDH 准同步
  • 基于视频图像的火灾检测算法

    要求 视频帧满足R x y gt gt R x y gt 190 gt 100 140 Y x y Cr x y x y Cb x y Y x y gt 通道均值 Cr x y gt 通道均值 Cb x y lt 通道均值条件且满足利用帧差
  • Java IO流分析整理

    Java中的流 可以从不同的角度进行分类 按照数据流的方向不同可以分为 输入流和输出流 按照处理数据单位不同可以分为 字节流和字符流 按照实现功能不同可以分为 节点流和处理流 输出流 输入流 因此输入和输出都是从程序的角度来说的 字节流 一
  • centos8 stream 屏幕共享 远程桌面 vnc 出错

    在连接vnc之前 干脆直接把防火墙禁用掉 免得出现别的麻烦 systemctl stop firewalld systemctl disable firewalld 然后直接去设置开启屏幕共享 然后用vnc客户端连接 会出现以下错误 Una
  • Redis实现分布式锁的7种方案,及正确使用姿势!

    redis学习笔记 7种方案前言 日常开发中 秒杀下单 抢红包等等业务场景 都需要用到分布式锁 而Redis非常适合作为分布式锁使用 本文将分七个方案展开 跟大家探讨Redis分布式锁的正确使用方式 如果有不正确的地方 欢迎大家指出哈 一起
  • Sqlserver 把小数点后面多余的0去掉

    select convert float 0 05000 结果 0 05 保留有效小数 convert decimal 18 4 0 00900 结果 0 0090 保留有效小数后转换数据类型 convert nvarchar 20 con
  • Python实现房产数据分析与可视化 数据分析 实战

    Python库的选择 话说 工欲善其事 必先利其器 虽然我们已经选择Python来完成剩余的工作 但是我们需要考虑具体选择使用Pytho的哪些利器来帮助我们更快更好地完成剩余的工作 我们可以看一下 在这个任务中 主要涉及到四类工作要完成 c
  • python三个变量互换值_Python中有几种办法交换两个变量的值?

    交换两个变量的值方法 这个面试题如果只写一种当然很简单 没什么可以说的 今天这个面试是问大家有几种办法来实现交换两个变量的值 在没开始看具体答案前 你可以先想想看 下面分别来说说这几种方法 1 方法一 通过新添加中间变量temp的方式 这个
  • Angular脚手架系列:四、使用Angular CLI进行Build (构建) 和 部署

    目录 一 Build 二 ng build 三 Build Targets和Environment 四 Serve 五 部署到nginx 一 Build Build主要会做以下动作 编译项目文件并输出到某个目录 Build targets决
  • ConstrainLayout 基础教程2,近期想跳槽的程序员必看

    特性详解 Visibility behavior 可见性的表现 ConstraintLayout对可见性被标记View GONE的控件 后称 GONE控件 有特殊的处理 一般情况下 GONG控件是不可见的 且不再是布局的一部分 但是在布局计
  • 【服务器】查看服务器文件夹大小

    问题描述 服务器的接口突然访问不到了 报错Networ Error 直接想到了 是不是数据库连不上了导致的 然后看了下服务器的硬盘占用情况 当然了 这里是处理过后的了 发现有问题的那个框框那个Avail为0了 查看文件夹占用 查看某个目录下
  • 旋转数组问题“环状替换”解法最详细的说明

    leecode 旋转数组 问题 环状替换 解法的思路 小白向 思路 假设一数组 a 1 2 3 4 5 6 7 8 9 移动位数k 3 从1开始 要将a 0 右移三位 移到a 3 a 3 右移三位 移到a 6 a 6 移到a 0 回到了a
  • 蓝桥杯2020年第十一届国赛真题-重复字符串

    题目描述 如果一个字符串 S 恰好可以由某个字符串重复 K 次得到 我们就称 S 是 K 次重复字符串 例如 abcabcabc 可以看作是 abc 重复 3 次得到 所以 abcabcabc 是 3 次重复字符串 同理 aaaaaa 既是
  • oracle 中使用 select a into b 时遇到空值问题

    今天一朋友问及我这个问题 当记录不存在 会提示 no data 的错误 下面是网上这类问题的解决方法 转载 当在PL SQL中执行SELECT INTO 语句时 如果返回结果集为空 则回触发NO DATA FOUND错误 但是当 SELEC
  • SSL/TLS原理 详细整理版

    1 SSL TLS握手 简化版 浏览器 服务器 发起 gt 1 浏览器通知服务器浏览器所支持的加密协议 接收 接收 lt 2 服务器通知浏览器从1中选用的加密协议 并给予证书 发起 3 用CA的公钥鉴别服务器的证书是否有效 有效则生成一个随
  • element 表格两级单元格合并功能

    代码如下
  • JavaWeb中servlet到底是干什么的

    JavaWeb中servlet到底是干什么的 javaweb工程包括 src下的 java文件WebRoot下的 jsp js等文件当工程运行时 tomcat先把 jsp gt java gt class 计算机只识别 class文件ser
  • andoid逐帧动画oom_帧动画内存OOM?不存在的!—— SurfaceView逐帧解析

    Android 提供了AnimationDrawable用于实现帧动画 在动画开始之前 所有帧的图片都被解析并占用内存 一旦动画较复杂帧数较多 在低配置手机上容易发生 OOM 即使不发生 OOM 也会对内存造成不小的压力 下面代码展示了一个
  • react小书,怎么渲染列表(react)

    在我们处理数据时 假如我们现在有一个用户列表存放到数组中 const users username Jerry age 21 gender male username Tomy age 22 gender male username Lil
  • java解决高并发之数据库连接池配置

    使用的IDE是IDEA 项目是springboot框架的项目 最近一直在处理高并发的问题 大致情况是这样的 大概有五六千人会在中午十二点同时访问网站 操作数据库 导致服务器崩溃 对于频繁修改数据的这种情况 例如 用户要抢商品 且抢完后要刷新