yhm050305

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

HikariCP连接池介绍

1、什么是连接池

数据库连接池负责分配、管理和释放数据库的连接。

  • 数据库连接复用:重复使用现有的数据库长连接,可以避免连接频繁建立、关闭的开销。
  • 统一的连接管理:释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏。

3、什么是HikariCP

HikariCP 是一个高性能的 JDBC 连接池组件,号称性能最好的后起之秀,是一个基于BoneCP做了不少的改进和优化的高性能JDBC连接池。

其作者还有产出了另外一个开源作品HikariJSON——高性能的JSON解析器。

代码体积更是少的可怜,130kb。Spring Boot 2都已经宣布支持了该组件,由之前的Tomcat换成HikariCP。

其性能远高于c3p0、tomcat等连接池,以致后来BoneCP作者都放弃了维护,在Github项目主页推荐大家使用HikariCP

上边说到是在BoneCP基础上做了优化,那做了哪些优化呢?

  • 字节码精简 :优化代码(HikariCP利用了一个第三方的Java字节码修改类库Javassist来生成委托实现动态代理,动态代理的实现在ProxyFactory类),直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;
  • 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
  • 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描,相对与ArrayList极大地提升了性能,而其中的区别是,ArrayList在每次执行get(Index)方法时,都需要对List的范围进行检查,而FastStatementList不需要,在能确保范围的合法性的情况下,可以省去范围检查的开销。
  • 自定义集合类型(ConcurrentBag):支持快速插入和删除,特别是在同一线程既添加又删除项时,提高并发读写的效率;
  • 针对CPU的时间片算法进行优化:尽可能在一个时间片里面完成各种操作(具体机制比较模糊)。
  • 针对连接中断的情况:比其他CP响应时间上有了极好的优化,响应时间为5S,会抛出SqlException异常,并且后续的getConnection()可以正常进行
  • 关于Connection的操作:另外在Java代码中,很多都是在使用完之后直接关闭连接,以前都是从头到尾遍历,来关闭对应的Connection,而HikariCP则是从尾部对Connection集合进行扫描,整体上来说,从尾部开始的性能更好一些。

HikariCP jar包下载

需要jar包以及版本,MySql版本一定要与本地电脑的版本一致:
mysql-connector-j-8.0.33.jar(jdbc)
HikariCP-4.0.3.jar(hikaricp连接池)
slf4j-api-1.7.9.jar(日志组件)

一、HikariCP 官网下载路径如下:

Central Repository: org/slf4j/slf4j-api/1.7.25 (maven.org)

Central Repository: com/zaxxer/HikariCP/4.0.3 (maven.org)

MySQL :: 下载 MySQL Connector/J (存档版本)

二、下载好 druid 的jar包

三、将下载好的 jar 包导入到idea项目里面去

1、根据个人需要将 HikariCP-4.0.3.jarslf4j-api-1.7.9.jar jar包文件复制到项目的 lib 路径下。

2、将lib文件夹 “添加为库” 或 将添加的jar包 “添加为库”(必要操作)

HikariCP 配置及使用(这里以MySql数据库演示)

一、HikariCP 配置及使用(使用配置文件初始化连接池配置)

1、创建properties配置文件

我用的是配置 文件名.properties 文件的方式,文件名随意。在项目的 src 目录下新建就行。:

配置文件内容:

# 驱动程序(加载MySql)
DriverClassName=com.mysql.cj.jdbc.Driver
# MySql数据库,自己创建的数据路径
JdbcUrl=jdbc:mysql://localhost:3306/20231124db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
# 用户名
Username=root
# 密码
Password=sasa
# 最大加载数量
MaximumPoolSize=60
# 最小加载数量
MinimumIdle=20
# 最大连接延迟时间,单位ms
MaxLifetime=6000

2、连接MySql数据库操作

public static void main(String[] args) throws IOException, SQLException {
    //获取配置文件
    Properties properties = new Properties();
    properties.load(new FileInputStream("src\\database.properties"));
    //将获取到的配置文件进行初始化配置
    HikariConfig config = new HikariConfig(properties);
    //创建HikariDataSource数据源
    HikariDataSource dataSource = new HikariDataSource(config);
    //从数据源获取连接
    Connection conn = dataSource.getConnection();
    //判断是否成功获取到连接
    if (conn !=null){
        System.out.println("连接成功");
    }else {
        System.out.println("连接失败");
    }
    //释放连接到连接池
    conn.close();
    dataSource.close();
}

运行结果:

二、HikariCP 配置及使用(使用代码来初始化连接池配置)

1、连接MySql数据库操作

public static void main(String[] args) throws SQLException {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/20231124db");
        config.setUsername("root");
        config.setPassword("sasa");
        config.setPoolName("MyPool");
        config.setMaximumPoolSize(10);
        HikariDataSource dataSource = new HikariDataSource(config);
        Connection conn = dataSource.getConnection();
        if (conn !=null){
            System.out.println("连接成功");
        }else {
            System.out.println("连接失败");
        }
        conn.close();
        dataSource.close();
    }

运行结果:

总结

通过本文的指导,你应该已经掌握了如何使用HikariCP连接池来优化和管理数据库连接。连接池可以大大提高数据库访问的性能和可伸缩性,而HikariCP作为一个高性能的连接池实现,可以帮助你更好地管理数据库连接。

posted on 2023-12-11 09:15  べ微熏の斜陽べ  阅读(68)  评论(0编辑  收藏  举报