池化技术介绍

一、数据库连接池

MySQL数据库连接过程分为两个部分

  1. 第一部分是前三个数据包。第一个数据包是客户端向服务端发送的一个"SYN"包,第二个包是服务端回给客户端的"ACK"包以及一个"SYN"包,第三个包是客户端回给服务端的"ACK"包,熟悉TCP协议的同学可以看出这是一个TCP的三次握手过程。

  2. 第二部分是MySQL服务端校验客户端密码的过程。其中第一个包是服务端发给客户端要求认证的报文,第二和第三个包是客户端将加密后的密码发送给服务端的包,最后两个包是服务端回给客户端认证OK的报文。假设此过程花费4ms。单条sql平均执行的时间是1ms,按照这种方式建立一次连接只执行一条SQL,1s只能执行200次数据库的查询。

数据库连接池预先建立数据库连接

实现原理:数据库连接池有两个最重要的配置:最小连接数和最大连接数,它们控制着从连接池中获取连接的流程。

  • 如果当前连接数小于最小连接数,则创建新的连接处理数据库请求;

  • 如果连接池中有空闲连接则复用空闲连接;

  • 如果空闲池中没有连接并且当前连接数小于最大连接数,则创建新的连接处理请求;

  • 如果当前连接数已经大于等于最大连接数,则按照配置中设定的时间(C3P0的连接池配置是checkoutTimeout)等待旧的连接可用;

  • 如果等待超过了这个设定时间则向用户抛出错误。

二、线程池

线程池的实现:JDK

1.5中引入的ThreadPoolExecutor就是一种线程池的实现,它有两个重要的参数:coreThreadCount和maxThreadCount,这两个参数控制着线程池的执行过程。

  • 如果线程池中的线程数少于coreThreadCount时,处理新的任务时会创建新的线程;

  • 如果线程数大于coreThreadCount则把任务丢到一个队列里面,由当前空闲的线程执行;

  • 当队列中的任务堆积满了的时候,则继续创建线程,直到达到maxThreadCount;

  • 当线程数达到maxTheadCount时还有新的任务提交,那么我们就不得不将它们丢弃了。

使用注意:

  1. JDK实现的这个线程池优先把任务放入队列暂存起来,而不是创建更多的线程,它比较适用于执行CPU密集型的任务,也就是需要执行大量CPU运算的任务。这是为什么呢?因为执行CPU密集型的任务时CPU比较繁忙,因此只需要创建和CPU核数相当的线程就好了,多了反而会造成线程上下文切换,降低任务执行效率。所以当前线程数超过核心线程数时,线程池不会增加线程,而是放在队列里等待核心线程空闲下来。

  2. 我们平时开发的Web系统通常都有大量的IO操作,比方说查询数据库、查询缓存等等。任务在执行IO操作的时候CPU就空闲了下来,这时如果增加执行任务的线程数而不是把任务暂存在队列中,就可以在单位时间内执行更多的任务,大大提高了任务执行的吞吐量。所以你看Tomcat使用的线程池就不是JDK原生的线程池,而是做了一些改造,当线程数超过coreThreadCount之后会优先创建线程,直到线程数到达maxThreadCount,这样就比较适合于Web系统大量IO操作的场景了。

  3. 如果你使用线程池请一定记住不要使用无界队列(即没有设置固定大小的队列)。也许你会觉得使用了无界队列后,任务就永远不会被丢弃,只要任务对实时性要求不高,反正早晚有消费完的一天。但是,大量的任务堆积会占用大量的内存空间,一旦内存空间被占满就会频繁地触发Full

    GC,造成服务不可用。

小结

  • 线程池的核心线程数和最大线程数的设置需谨慎,根据实际情况来设定合适的值,避免浪费资源。

  • 线程池中的对象在使用之前预先完成初始化,使用线程池前需要预先初始化所有的核心线程。

  • 线程池核心:以空间换时间,在使用线程池后要随时关注空间的占用情况,避免出现空间过度使用导致内存泄露或频繁的进行垃圾回收等。

相关推荐
276695829218 分钟前
拼多多 anti-token unidbg 分析
java·python·go·拼多多·pdd·pxx·anti-token
YGGP32 分钟前
MySQL 的事务
数据库·mysql
xyliiiiiL1 小时前
二分算法到红蓝染色
java·数据结构·算法
编程、小哥哥1 小时前
spring之添加freemarker模版熏染
java·后端·spring
hong_zc1 小时前
Spring 拦截器与统一功能的处理
java·后端·spring
User_芊芊君子1 小时前
【Java】——数组深度解析(从内存原理到高效应用实践)
java·开发语言
珹洺2 小时前
C++从入门到实战(十)类和对象(最终部分)static成员,内部类,匿名对象与对象拷贝时的编译器优化详解
java·数据结构·c++·redis·后端·算法·链表
一 乐2 小时前
网红酒店|基于java+vue的网红酒店预定系统(源码+数据库+文档)
java·开发语言·数据库·毕业设计·论文·springboot·网红酒店预定系统
Alfadi联盟 萧瑶3 小时前
Python-用户账户与应用程序样式
数据库·sqlite
xyliiiiiL4 小时前
从责任链模式聊到aware接口
java·开发语言