池化技术

  张一帆   2021年05月12日


池化技术

  • 概念

  池化技术就是把一些能复用的实例放在一起,一般指的是内存里,而池这个概念也是一个虚拟的概念。这样做的好处是省去了每次消耗在新建、销毁这些实例的时间,从而提高了整体服务性能。在开发中,我们经常遇到的就是数据库的连接池和多线程的线程池。连接池的管理是核心。

  • 数据库连接池

  数据库包括关系型数据库和非关系型数据库两种。关系型数据库指的是mysql,非关系型数据库指的是redis。

  mysql连接池有两个重要的配置:最小连接数和最大连接数。

  1. 如果当前连接数小于最小连接数,则创建新的连接处理请求。
  2. 如果连接池中有空闲连接,则使用空闲连接。 3。 如果没有空闲连接,并且当前连接数小于最大连接数,则继续创建新的连接。这等价于建立一个新的连接。这些连接使用完成不会立马清除,而是放在池中等待复用最终空闲超过一段时间后自动释放。
  3. 如果当前连接数大于等于最大连接数,并且没有空闲连接了,则进入等待队列,在超时时间内等待空闲连接。
  4. 超时之后,则提示超时失败。获取数据库连接失败。

  redis连接池有3个重要的配置:最大连接数,最小空闲数,最大空闲数

  1. 当前连接小于最大连接数,则创建新的连接处理请求。
  2. 当前连接数大于等于最大连接数,超出的连接进入等待队列LinkedBlockingDeque,判断是否开启blockWhenExhausted,是则等待获取连接,否则抛错连接池已耗尽。
  3. 当前连接数小于最小空闲数,则预热最小空闲数连接。
  4. 当前连接数大于最大空闲数,则强制销毁这些多出来的连接。
  • 线程池

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

  1. 如果当前线程数少于coreThreadCount时,则创建新的线程处理请求。
  2. 如果当前线程数大于coreThreadCount则将超出的任务进队列,由当前空闲的线程执行。
  3. 当队列中的任务对接满时,则继续创建线程,直到maxThreadCount。
  4. 当前线程数达到maxThreadCount时还有新的任务,就将其按照抛弃策略进行抛弃。

JDK线程池提交任务示意图

  • 总结

  连接池和线程池在开发过程中并不陌生,但是想真正弄懂他们还是需要借助阅读源码的帮助。在使用上如果遇到了一些困惑的话,可以查阅相关资料或者探索源码如何解决的。