1. 池化技术
如果没有池的话,我们需要多次的创建和释放对象;如果放在池中可以统一的创建和销毁。
池化技术能够减少资源对象的创建次数,提高程序的响应性能,特别是在高并发下这种提高更加明显。
使用池化技术缓存的资源对象有如下共同特点:
- 对象创建时间长
- 对象创建需要大量资源
- 对象创建后可被重复使用
常见的线程池、内存池、连接池、对象池都具有以上的共同特点。
线程池和连接池区别
线程池:主动操作,主动执行任务
连接池:被动操作(类似内存池),池的对象被任务获取,执行完任务后归还
2. 数据库连接池 (MySQL/Redis)
定义:数据库连接池(connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
简单理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,更加安全可靠。
- 不使用连接池
1) TCP建立连接的三次握手(客户端与MySQL服务器的连接基于TCP协议)
2)MySQL认证的三次握手
3)执行sql语句
4)MySQL关闭
5)TCP四次握手关闭
为了执行一条SQL语句,需要进行很多其他的操作,执行SQL操作在所有操作中占比很低
优点:实现简单
缺点:
网络IO较多;
带宽利用率低;
QPS较低;
应用频繁创建连接和关闭连接,导致临时对象较多,带来更多内存碎片;
关闭连接后,会出现大量TIME_WAIT的TCP状态
- 使用连接池
获取连接--> 执行sql--> 归还连接
优点:
降低了网络开销
连接复用,有效减少连接数
提升性能,避免频繁的新建连接。新建连接的开销比较大
没有TIME_WAIT状态的问题
缺点:
设计较为复杂
3. 长连接和连接池的区别
- 长连接是一些驱动、驱动框架、ORM工具的特性,由驱动来保持连接句柄的打开,以便后序的数据库操作可以重用连接,从而减少数据库的连接开销
- 连接池是应用服务器的组件,可以通过参数来配置连接数、连接检测、连接的生命周期等
- 连接池内的连接其实就是长连接
4. 数据库连接池运行机制
1)从连接池获取或创建可用连接
2)使用完毕之后,把连接返回给连接池
3)在系统关闭前,断开所有连接并释放连接占用的系统资源
5. 连接池连接设置数量
连接数=(核心数*2)+ 有效磁盘数
此处只是一个经验公式,还要结合线程池数量、具体业务
CPU总核数=物理CPU个数 * 每颗物理CPU的核数
总逻辑CPU数=物理CPU个数*每颗物理CPU的核数*超线程数
其余补充:
1. 如果使用MySQL或MariaDB,不要用“utf8”编码,改用“utf8mb4”。(在mysql中utf8mb4表示的是真正的utf-8编码)
2. top查看CPU使用率,如果超过100,说明该CPU是多核的,top之后按1,可以显示每个CPU的使用率,top里显示的是把每个CPU的使用率加起来
3. CPU补充知识
1)物理CPU
插在主机上能看的见摸得着的那个CPU硬件
2)CPU核数
一块物理CPU上能处理数据的芯片组数量。一个物理CPU上可能会有多个核心,平时所说的2核、4核就是指CPU的核心。
3)逻辑CPU
逻辑CPU的概念比较抽象,简单理解为一个处理单元,总的逻辑CPU数对应总的CPU核数,借助超线程技术,一个核用起来像两个核,这时逻辑CPU数就是核心数的两倍了。
4. 一些查询命令
Linux cut命令 | 菜鸟教程
Linux uniq 命令 | 菜鸟教程
# 查看CPU信息(型号)
parallels@parallels-vm:~$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
2 Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz
# 查看物理CPU个数
parallels@parallels-vm:~$ cat /proc/cpuinfo | grep "physical id" | sort | wc -l
2
# 查看每个物理CPU中core的个数(即核数)
parallels@parallels-vm:~$ cat /proc/cpuinfo | grep "cpu cores" | uniq
cpu cores : 2
# 查看逻辑CPU的个数
parallels@parallels-vm:~$ cat /proc/cpuinfo | grep "processor" | wc -l
2
更多推荐
MySQL连接池
发布评论