大人,时代变了,不要再用老一代的数据库连接池啦(HicariCP)

数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池的原理

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等

Java常见的数据库连接池

C3P0

优点:功能简单易用,稳定性好
缺点:性能很差,架构设计过于复杂

DBCP

优点:生态圈中的影响里十分广泛,例如Tomcat就在内部集成了DBCP,实现JPA规范的OpenJPA,也是默认集成DBCP
缺点:核心功能依赖于Commons中的另一个子项目Pool,所以因为pool的更新缓慢,导致DBCP更新缓慢

HikariCP

优点:性能好,并且稳定性也不差,自身小巧

Druid

优点:国内开源软件中文文档全,功能全面除了提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能

详细介绍HikariCP这么快

1.为什么HikariCP这么快
  • 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;
  • 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
  • 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
  • 自定义集合类型(ConcurrentBag):提高并发读写的效率;
  • 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)。
2.SpringBoot2.0如何整合HikariCP
1.因为SpringBoot2.0已经整合HikariCP的jar包了,所以不用在pom文件里引用了
2.在application.yml文件中配置数据源
############################################################
#
# 配置数据源信息
#
############################################################
spring:
  datasource:                                           # 数据源的相关配置
    type: com.zaxxer.hikari.HikariDataSource     # 数据源类型:HikariCP
    driver-class-name: com.mysql.jdbc.Driver       # mysql驱动
    url: jdbc:mysql://localhost:3306/foodie-shop-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: root
    hikari:
      connection-timeout: 30000       # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30秒
      minimum-idle: 5                 # 最小连接数
      maximum-pool-size: 20           # 最大连接数
      auto-commit: true               # 自动提交
      idle-timeout: 600000            # 连接超时的最大时长(毫秒),超时则被释放(retired),默认:10分钟
      pool-name: DateSourceHikariCP     # 连接池名字
      max-lifetime: 1800000           # 连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms
      connection-test-query: SELECT 1
3.连接池中的最大连接数是越大越好嘛?

错:连接数的多少与cpu的核数有关,大家应该知道在一核cup上同一时刻只能运行一个线程,那是如何实现“同时”运行几百个线程的呢?那是因为操作系统切换上下文,CPU 核心快速调度,执行另一个线程的代码,不停反复,给我们造成了所有进程同时运行假象。所以在一个线程上顺序执行A和B一定比通过时间分片切换“同时”执行A和B要快,那么在多核情况下一旦线程数超过核数,在增加线程数系统会变得更慢,所以并不是链接数越大就越好

发布了27 篇原创文章 · 获赞 5 · 访问量 506

猜你喜欢

转载自blog.csdn.net/qq_38446413/article/details/105096892