HikariCP连接池

什么是连接池?

一个普通的java程序,要查询或使用数据库的数据,基本流程是需要通过三次握手和四次挥手,导致进行一次操作时,要进行很多次的网络交互。
转至
图片转至:https://zhuanlan.zhihu.com/p/44265547
这样做的缺点有:

  • 网络io多
  • 相应时间长
  • 频繁的创建连接和关闭连接,增大服务器负担,影响其性能。

正是处于这个背景之下,连接池应运而生。那么,什么是数据库连接池呢?顾名思义,就是一个放数据库连接的池子,用户端需要的访问数据库的时候,就从连接池中取一个连接出来,用完之后,再放回去。
在这里插入图片描述
图片转至:https://zhuanlan.zhihu.com/p/44265547
从上图我们可以知道,数据库的连接的创建和关闭,都由连接池完成。从而,大大的提高了效率。
我们知道了大体构造之后,我们就要了解连接池是如何管理数据库连接的。

  • 当服务器打开时,根据配置中的最小连接数,创建该数量的数据库连接,创建完成后,放入连接池中。
  • 客户端访问时,首先查看连接池是否有空闲连接,如果有,那么给客户端;如果,没有,就查看是否到达最大连接量,如果没有到最大连接量,就新创建个连接给它,反之,就让客户端处于等待状态,当等待时间超出最大等待时间,就抛出个异常个客户端。
  • 当客户端释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留等待再次使用。
  • 关闭服务器时,关闭池中所有连接,释放所有资源。

HikariCP连接池

Java中,关于数据库的连接池有很多,我们首先来看HikariCP连接池,为什么要先说这个?因为,它是所有连接池中公认最快的。
HikariCP 为什么这么快?
1、节码级别优化(很多方法通过 JavaAssist 生成)
2、大量小改进

  • 用 FastStatementList 代替 ArrayList
  • 无锁集合 ConcurrentBag
  • 代理理类的优化(比如,用 invokestatic 代替了 invokevirtual)

首先,什么是JavaAssist ?
关于java字节码的处理,目前有很多工具,如bcel,asm。不过这些都需要直接跟虚拟机指令打交道。如果你不想了解虚拟机指令,可以采用javassist。javassist是jboss的一个子项目,其主要的优点,在于简单,而且快速。直接使用java编码的形式,而不需要了解虚拟机指令,就能动态改变类的结构,或者动态生成类。(转至搜狗百科)

什么是FastStatementList?
自定义数组类型(FastStatementList)代替 ArrayList:避免每次 get() 调用都要行 range check,避免调用 remove() 时从头到尾的扫描。

什么是ConcurrentBag?
自定义集合类型(ConcurrentBag):提高并发读写的效率。

在 Spring Boot 中的配置
Spring Boot 2.x中
默认使⽤ HikariCP
配置 好spring.datasource.hikari.* 配置即可
Spring Boot 1.x中
默认使⽤用 Tomcat 连接池,需要移除 tomcat-jdbc 依赖
加入spring.datasource.type=com.zaxxer.hikari.HikariDataSource依赖

常用 HikariCP 配置参数
常⽤配置 :
• spring.datasource.hikari.maximumPoolSize=10(数据库连接池的最大容量)
• spring.datasource.hikari.minimumIdle=10(最小连接ldle个数)
• spring.datasource.hikari.idleTimeout=600000(ldle的最大超时时间)
• spring.datasource.hikari.connectionTimeout=30000(等待连接的最大超时时间)
• spring.datasource.hikari.maxLifetime=1800000(一个连接的最大存活时间)

什么是minimumIdle?
控制连接池空闲连接的最小数量,当连接池空闲连接少于minimumIdle,而且总共连接数不大于maximumPoolSize时,HikariCP会尽力补充新的连接。为了性能考虑,不建议设置此值,而是让HikariCP把连接池当做固定大小的处理,默认minimumIdle与maximumPoolSize一样。
当minIdle<0或者minIdle>maxPoolSize,则被重置为maxPoolSize,该值默认为10。(转至https://blog.csdn.net/weixin_34067102/article/details/87994673)

其他配置详见 HikariCP 官⽹ https://github.com/brettwooldridge/HikariCP

对于HikariCP连接池,动态密码可以通过以下步骤实现: 1. 首先,添加HikariCP和MyBatis-Plus的依赖到你的项目中。 2. 在配置文件(比如application.properties或application.yml)中配置HikariCP连接池的相关参数,比如数据库URL、用户名、初始密码等。将密码字段设置为占位符,例如:`spring.datasource.password=placeholder`. 3. 在项目启动时,通过编程方式获取到真实的密码,并将其设置到HikariCP连接池的配置中。 4. 可以使用Spring的事件机制,在应用启动时监听事件,在事件监听器中获取真实密码并设置到HikariCP连接池配置中。 下面是一个示例代码: ```java @Component public class HikariPasswordListener implements ApplicationListener<ApplicationReadyEvent> { @Autowired private HikariDataSource dataSource; @Override public void onApplicationEvent(ApplicationReadyEvent event) { // 获取真实密码的逻辑,可以从配置文件、数据库或其他安全存储中获取 String realPassword = "your_real_password"; // 设置真实密码到HikariCP连接池配置中 dataSource.setPassword(realPassword); } } ``` 在上述示例中,我们创建了一个监听器 `HikariPasswordListener`,并在应用启动时监听 `ApplicationReadyEvent` 事件。在监听器中,我们注入了 `HikariDataSource` 对象,并获取真实的密码。然后将真实密码设置到 `HikariDataSource` 对象的密码字段中。 这样,HikariCP连接池就可以使用动态密码了。注意,示例中使用了Spring的事件机制,如果你的项目没有使用Spring,可以考虑使用其他适合的方式来设置真实密码到HikariCP连接池配置中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值