当前位置:   article > 正文

什么是HikariCP?HikariCP介绍(包含配置示例)

hikaricp

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

数据库连接复用:重复使用现有的数据库长连接,可以避免连接频繁建立、关闭的开销。
统一的连接管理:释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏。
什么是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 的使用
重要参数
maximum-pool-size   池中最大连接数(包括空闲和正在使用的连接)
minimum-idle   池中最小空闲连接数量。默认值10
pool-name   连接池的名字
auto-commit   是否自动提交池中返回的连接。默认值为true。
idle-timeout    空闲时间。仅在minimum-idle小于maximum-poop-size的时候才会起作用。默认值10分钟。
max-lifetime   连接池中连接的最大生命周期。当连接一致处于闲置状态时,数据库可能会主动断开连接。
connection-timeout   连接超时时间。默认值为30s,可以接收的最小超时时间为250ms。但是连接池请求也可以自定义超时时间

  1. #
  2. # 配置数据源相关    使用 HikariCP 数据源
  3. #
  4. ############################################################
  5. # 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认:30
  6. spring.datasource.hikari.connection-timeout=30000
  7. # 最小连接数
  8. spring.datasource.hikari.minimum-idle=5
  9. # 最大连接数
  10. spring.datasource.hikari.maximum-pool-size=15
  11. # 自动提交
  12. spring.datasource.hikari.auto-commit=true
  13. # 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),默认:10分钟
  14. spring.datasource.hikari.idle-timeout=600000
  15. # 连接池名字
  16. spring.datasource.hikari.pool-name=DatebookHikariCP
  17. # 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认:30分钟 1800000ms,建议设置比数据库超时时长少60秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
  18. spring.datasource.hikari.max-lifetime=28740000
  19. spring.datasource.hikari.connection-test-query=SELECT 1


注意:如果配置不当,数据库连接池也可能因影响到系统性能

Maven

  1. <dependency>
  2.     <groupId>com.zaxxer</groupId>
  3.     <artifactId>HikariCP</artifactId>
  4.     <version>1.3.5</version>
  5.     <scope>compile</scope>
  6. </dependency>


支持数据库
支持多种常见的数据库(包含但不限于):

Oracle、MS SQL Server、MySQL、PostgreSQL:

HikariCP的使用: 

第一步: 导入Maven依赖 

  1. <!-- HikariCP -->
  2. <dependency>
  3. <groupId>com.zaxxer</groupId>
  4. <artifactId>HikariCP</artifactId>
  5. <version>2.6.0</version>
  6. </dependency>

注意: 依赖的版本如果使用JDK1.8的话, 可以使用1.4版本, 如果使用JDK9以上的话, 就必须使用高版本的依赖, 否则HikariCp会报版本不兼容的问题                                                                            
第二步: 直接上代码: 

  1. /**
  2. * @Description: HikariConfig的demo
  3. * @Author: baixuehui
  4. * @Date: 2023/6/19
  5. */
  6. @PostMapping("/HikariCP")
  7. public R<List<Map<String, Object>>> HikariCP(){
  8. List<Map<String, Object>> resultList = null;
  9. // 创建HikariCP配置对象
  10. HikariConfig config = new HikariConfig();
  11. //设置数据库驱动类名
  12. config.setDriverClassName("com.mysql.cj.jdbc.Driver");
  13. //设置JDBC连接URL
  14. config.setJdbcUrl("jdbc:mysql://182.42.92.23:3306/ry-cloud");
  15. //设置用户名
  16. config.setUsername("root");
  17. //设置密码
  18. config.setPassword("bxh520zj");
  19. long currentTimeMillis = System.currentTimeMillis();
  20. //使用配置对象创建HikariCP数据源
  21. HikariDataSource ds = new HikariDataSource(config);
  22. long currentTimeMillis1 = System.currentTimeMillis();
  23. log.info("连接数据库耗时为[{}]",currentTimeMillis1 - currentTimeMillis);
  24. // // 获取数据库连接
  25. try(Connection connection = ds.getConnection()){
  26. // 定义查询语句
  27. String sql = "SELECT * FROM sys_user";
  28. // 创建Statement对象
  29. try (Statement statement = connection.createStatement();
  30. // 执行查询操作
  31. ResultSet resultSet = statement.executeQuery(sql)) {
  32. // //结果集合
  33. resultList = new ArrayList<>();
  34. // 获取结果集
  35. ResultSetMetaData metaData = resultSet.getMetaData();
  36. // 获取列数
  37. int columnCount = metaData.getColumnCount();
  38. // 遍历结果集
  39. while (resultSet.next()) {
  40. // 创建Map集合
  41. Map<String, Object> rowMap = new HashMap<>();
  42. // 遍历列
  43. for (int i = 1; i <= columnCount; i++) {
  44. // 获取列名
  45. String columnName = metaData.getColumnName(i);
  46. // 获取列值
  47. Object columnValue = resultSet.getObject(i);
  48. // 添加到Map集合
  49. rowMap.put(columnName, columnValue);
  50. }
  51. // 添加到结果集合
  52. resultList.add(rowMap);
  53. }
  54. //输出结果集合
  55. System.out.println("查询结果集合: " + resultList);
  56. }
  57. //关闭connection
  58. connection.close();
  59. System.out.println("连接成功");
  60. }catch (Exception e){
  61. System.out.println("连接失败:" + e.getMessage());
  62. e.printStackTrace();
  63. }
  64. return R.ok("查询数据成功!",resultList);
  65. }

springboot中application文件进行配置: 

  1. #
  2. # 配置数据源相关 使用 HikariCP 数据源
  3. #
  4. ############################################################
  5. spring:
  6. datasource:
  7. hikari: # 时间单位均为ms
  8. minimum-idle: 5 # 建议不设置,但如使用idle-timeout,该值需要小于maximum-pool-size
  9. maximum-pool-size: 10 # hikari做过测试根据CPU计算最优最大连接池,如下
  10. # connections = ((cpu_core_count * 2) + effective_spindle_count)
  11. # 如4-Core i7,公式为9 = ((4 * 2) + 1),最后一个是有效的主核心数
  12. auto-commit: true # 默认
  13. idle-timeout: 300000 # 该值建议小于max-lifetime
  14. max-lifetime: 600000 # 该值建议小于数据库的连接关闭等待时间,详细的看下面分析
  15. connection-timeout: 10000 # 默认30s,连接超时会报异常
  16. # Connection is not avaitabte, request timed out after 59089ms
  17. validation-timeout: 5000 # 支持JDBC4的是isValid超时时间,不支持的是testQuery超时时间
  18. connection-test-query: 'SELECT 1' # 支持JDBC4的不建议使用,因为JDBC4的isValid方法效率更高

运行结果: 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/160744
推荐阅读
相关标签
  

闽ICP备14008679号