HikariCP连接池概述池化思想
池化思想是我们项目开发过程中的一种非常重要的思想,如整数池,字符串池,对象池、连接池、线程池等都是池化思想的一种应用,都是 通过复用对象,以减少因创建和释放对象所带来的资源消耗,进而来提升系统性能。 例如Integer对象的内部池应用。
package com.cy.java.pool;
public class TestInteger01 {
public static void main(String[] args) {
Integer n1=100;//Integer.valueOf(100) 编译时优化
Integer n2=100;
Integer n3=200;
Integer n4=200;//池中没有则new Integer(200)
System.out.println(n1==n2);//true
System.out.println(n3==n4);//false
}
}
这就是因为Intrger对象维护了一个常量池,相同数据不再开辟空间存储区间是-128--127。连接池原理
在系统初始化的时候,在内存中开辟一片空间,将一定数量的数据库连接作为对象存储在对象池里,并对外提供数据库连接的获取和归还方法。用户访问数据库时,并不是建立一个新的连接,而是从数据库连接池中取出一个已有的空闲连接对象;使用完毕归还后的连接也不会马上关闭,而是由数据库连接池统一管理回收,为下一次借用做好准备。如果由于高并发请求导致数据库连接池中的连接被借用完毕,其他线程就会等待,直到有连接被归还。整个过程中,连接并不会关闭,而是源源不断地循环使用,有借有还。数据库连接池还可以通过设置其参数来控制连接池中的初始连接数、连接的上下限数,以及每个连接的最大使用次数、最大空闲时间等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。java中的连接池
Java官方,为了在应用程序中更好的应用连接池技术,定义了一套数据源规范,例如javax.sql.DataSource接口,基于这个接口,很多团队或个人创建了不同的连接池对象。然后我们的应用程序中通过耦合与DataSource接口,便可以方便的切换不同厂商的连接池。Java项目中通过连接池获取连接的一个基本过程,如下图所示:

在上图中,用户通过DataSource对象的getConnection()方法,获取一个连接。假如池中有连接,则直接将连接返回给用户。假如池中没有连接,则会调用Dirver(驱动,由数据库厂商进行实现)对象的connect方法从数据库获取,拿到连接以后,可以将连接在池中放一份,然后将连接返回给调用方。连接需求方再次需要连接时,可以从池中获取,用完以后再还给池对象。
数据库连接池在Java数据库相关中间件产品群中,应该算是底层最基础的一类产品,作为企业应用开发必不可少的组件,无数天才们为我们贡献了一个又一个的优秀产品,它们有的随时代发展,功成身退,有的则还在不断迭代,老而弥坚,更有新生代产品,或性能无敌,或功能全面。目前市场上常见的连接池有DBCP、C3P0,DRUID,HikariCP等。SpringBoot工程下HikariCP整合测试数据初始化
打开mysql控制台,然后按如下步骤执行goods.sql文件。
第一步:登录mysql。
mysql –uroot –p1234
第二步:设置控制台编码方式。
set names utf8;
第三步:执行goods.sql文件(切记不要打开文件复制到mysql客户端运行)。
source d:/goods.sql
其中goods.sql文件内容如下:
drop database if exists dbgoods;
create database dbgoods default character set utf8;
use dbgoods;
create table tb_goods(
id bigint primary key auto_increment,
name varchar(100) not null,
remark text,
createdTime datetime not null
)engine=InnoDB;
insert into tb_goods values (null,'java','very good',now());
insert into tb_goods values (null,'mysql','RDBMS',now());
insert into tb_goods values (null,'Oracle','RDBMS',now());
insert into tb_goods values (null,'java','very good',now());
insert into tb_goods values (null,'mysql','RDBMS',now());
insert into tb_goods values (null,'Oracle','RDBMS',now());
insert into tb_goods values (null,'java','very good',now()); 创建项目Module并添加相关依赖
第一步:基于IDEA创建项目Module,如图所示:

SpringBoot-整合HikariCP连接池
第二步:添加依赖

  1. mysql数据库驱动依赖。

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

  1. spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池)。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency> 配置HikariCP连接池
打开application.properties配置文件,添加如下内容(必写)。
#spring datasource
spring.datasource.url=jdbc:mysql:///dbgoodsserverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=1234
hikariCP 其它额外配置(可选),代码如下(具体配置不清晰的可自行百度):
spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1 HikariCP 连接池测试
单元测试API设计及应用分析,如图所示:

在项目中添加单元测试类及测试方法,代码如下:
package com.cy.pj.common.datasource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
@SpringBootTest public class DataSourceTests {
/**
* DataSource 由谁定义? java 官方
* DataSource 定义了什么? 定义了从数据库或连接池获取连接Connection的一种规范
* 我们为什么要耦合于它? 类与之间存在依赖(耦合)时,尽量依赖于抽象规范。
* 程序运行时这个变量指向的对象类型是谁?HikariDataSource 你是怎么知道的?
*/ @Autowired
private DataSource dataSource; //interface
@Test
public void testConnection() throws Exception{
//通过datasource获取连接的一个过程是怎么样的 System.out.println(dataSource.getConnection()); //HikariProxyConnection@524566446 wrapping com.mysql.cj.jdbc.ConnectionImpl@73ba6fe6
}
}
在当前测试类中我们需要:

  • 掌握单元测试类、测试方法编写规范。
  • 理解DataSource的设计规范及规范的实现。
  • 分析在测试类中dataSource属性指向的对象是谁?
  • 分析在测试类中DataSource的实现类对象由谁创建和管理?
  • 思考基于DataSource接口获取连接的基本过程是怎样的?

基于HikariCP实现JDBC操作业务分析
基于HikariCP,借助JDBC技术访问商品库中的数据。API架构设计
基于业务,进行API设计,如图所示:

业务时序图分析
基于业务需求,进行商品查询过程的的时序图设计,如图所示:

业务代码设计及实现
第一步:定义GoodsDao接口,例如:
package com.cy.pj.goods.dao;
import java.util.List;
import java.util.Map;
/**
* 商品模块数据访问层接口
*/
public interface GoodsDao {
/**
* 查询所有商品信息,将每一行记录存储到一个map对象,然后将多个存储到list集合.
*/ List<Map<String,Object>> findGoods();
}
第二步:创建GoodsDao接口实现类,代码如下:
package com.cy.pj.goods.dao;
/**
* 此对象为一个商品数据层访问对象,现在要求在此类中定义一个方法,这个方法基于JDBC从从数据库获取商品信息,并将其封装到map集合,要求一个行记录一个map对象(key为表中字段名,值为字段名对应的值),多个map存储到list集合. @Repository此注解通常用于描述数据层实现类对象,本质上就是一个特殊的@Component, 都是要交给spring框架管理的一个Bean对象 */
@Repository
public class DefaultGoodsDao implements GoodsDao{
@Autowired private DataSource dataSource;//hikariCP
/**查询商品信息,一行记录映射为内存中的一个map对象*/
public List<Map<String,Object>> findGoods(){
Connection conn=null;//java.sql.*
Statement stmt=null;
ResultSet rs=null;
String sql="select * from tb_goods";
//1.获取连接(从连接池获取)
try {
conn=dataSource.getConnection();
//2.创建statement对象
stmt=conn.createStatement();
//3.发送sql
rs=stmt.executeQuery(sql);
//4.处理结果
List<Map<String,Object>> list=new ArrayList<>();
while(rs.next()){//循环一次取一行,一行记录映射为一个map对象
list.add( rowMap(rs));//将存储了一行记录的map对象再存储到list集合
}
return list; }catch (SQLException e){
e.printStackTrace();
throw new RuntimeException(e);//转换为非检查异常(编译时不检测的异常)
}finally{
//5. 释放资源
close(rs,stmt,conn);
}
}
定义行映射方法
private Map<String,Object> rowMap(ResultSet rs)throws SQLException{
Map<String,Object> rowMap=new HashMap<>();
//方法1映射
//rowMap.put("id",rs.getInt("id"));
//rowMap.put("name",rs.getString("name")); //rowMap.put("remark",rs.getString("remark")); //rowMap.put("createdTime",rs.getTimestamp("createdTime"));
//方法2映射
ResultSetMetaData rsmd=rs.getMetaData();//获取元数据(包括表中的字段名)
int columnCount=rsmd.getColumnCount();//获取列的数量
for(int i=0;i<columnCount;i++){ rowMap.put(rsmd.getColumnLabel(i+1),rs.getObject(rsmd.getColumnLabel(i+1)));
//getColumnLabel(i+1);获取表中字段名或字段名对应的别名
}
return rowMap;
}
定义释放资源的方法
private void close(ResultSet rs,Statement stmt,Connection conn){ if(rs!=null)try{rs.close();}catch(Exception e){e.printStackTrace();} if(stmt!=null)try{stmt.close();}catch(Exception e){e.printStackTrace();} //这里的连接是返回到了池中
if(conn!=null)try{conn.close();}catch(Exception e){e.printStackTrace();}
}
} 测试代码的编写及运行
定义单元测试类,并对其查询过程进行单元测试,例如:
package com.cy.pj.goods.dao;
@SpringBootTest
public class GoodsDaoTests {
@Autowired
private GoodsDao goodsDao;
@Test
void testFindGoods(){
List<Map<String,Object>> list= goodsDao.findGoods();
for(Map<String,Object> map:list){
System.out.println(map);
}
}
} 测试运行过程中的BUG分析
对测试过程中出现的问题进行记录,分析,总结.总结(Summary)
总之,数据库连接池的为我们的项目开发及运行带来了很多优点,具体如下:

  • 资源重用更佳。

由于数据库连接得到复用,减少了大量创建和关闭连接带来的开销,也大大减少了内存碎片和数据库临时进程、线程的数量,使得整体系统的运行更加平稳。

  • 系统调优更简便。

使用了数据库连接池以后,由于资源重用,大大减少了频繁关闭连接的开销,大大降低了TIME_WAIT的出现频率。

  • 系统响应更快。

数据库连接池在应用初始化的过程中一般都会提前准备好一些数据库连接,业务请求可以直接使用已经创建的连接,而不需要等待创建连接的开销。初始化数据库连接配合资源重用,使得数据库连接池可以大大缩短系统整体响应时间。

  • 连接管理更灵活。

数据库连接池作为一款中间件,用户可以自行配置连接的最小数量、最大数量、最大空闲时间、获取连接超时间、心跳检测等。另外,用户也可以结合新的技术趋势,增加数据库连接池的动态配置、监控、故障演习等一系列实用的功能。

mysql api 连接池_SpringBoot-整合HikariCP连接池相关推荐

  1. druid连接池_SpringBoot整合JDBCTemplate及Druid连接池

    SpringBoot整合JDBCTemplate 本篇文章将会介绍用SpringBoot整合JDBCTemplate来实现简单的增删改查的功能.及通过SpringBoot整合Druid数据库连接池实时 ...

  2. redis 连接池_SpringBoot整合redis

    闲来没事,把之前自己搭建的SpringBoot集成Redis整理了一下,相信网上有很多,我只是写一下搭建的文章,能帮到就好,不能帮助,也是自己整理的文档罢了.文章开始: 开发工具用的IDEA 2018 ...

  3. springboot链接MySQL线程池_SpringBoot中的数据库连接池

    内置的连接池 目前Spring Boot中默认支持的连接池有dbcp,dbcp2, tomcat, hikari三种连接池. 数据库连接可以使用DataSource池进行自动配置. 由于Tomcat数 ...

  4. mysql druid 多数据源_SpringBoot使用阿里数据库连接池Druid以及多数据源配置

    SpringBoot使用阿里数据库连接池Druid以及多数据源配置 引入依赖 com.alibaba druid 1.0.29 数据源配置 1.数据源 #master数据源 spring.dataso ...

  5. @async 默认线程池_springboot@Async默认线程池导致OOM问题

    地址:http://suo.im/5Y3RGF 作者:ignorewho 前言: 最近项目上在测试人员压测过程中发现了OOM问题,项目使用springboot搭建项目工程,通过查看日志中包含信息:un ...

  6. springboot 初始化线程池_springboot项目中线程池的使用

    在application.properties添加线程池配置项 spring.task.scheduling.thread-name-prefix=SysAsyncExecutor_ spring.t ...

  7. MyBatis复习(九):MyBatis整合C3P0连接池

    为什么引入连接池 首先我们要明白," 建立数据库连接 " 是相当消耗资源和时间的,同时,建立数据库连接的数量也是有限的(所以在初学时,才强烈要求操作完后,一定要记得关闭数据库连接, ...

  8. springboot整合mybatis 使用HikariCP连接池

    springboot整合mybatis 使用HikariCP连接池 前言 Springboot让Java开发更加美好,本节主要讲的是使用Hikari数据库连接池,如果需要使用druid连接池的请看我另 ...

  9. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库

    一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...

最新文章

  1. linux内核模块的强制删除-结束rmmod这类disk sleep进程
  2. 使用pgpool-ii建立PostgreSQL链接池
  3. Arduino 笔记。开篇
  4. 协方差与相关系数的再理解
  5. Android 设置Activity样式 透明度
  6. webpack打包ES6降级ES5
  7. 浅说深度学习(1):核心概念
  8. Bezier(贝塞尔)曲线(三阶)的轨迹规划在自动驾驶中的应用(四)
  9. php checkbox后台判断是否选中,jquery如何判断是否选中checkbox
  10. css3 box-shadow阴影(外阴影与外发光)讲解
  11. Linux Shell 判断块设备节点是否存在
  12. 用户虚拟地址转换成物理地址
  13. 蓝桥杯 ADV-206 算法提高 不大的数
  14. 二级建造师学python有用_二级建造师
  15. linux查看进程加载的jar包,[Linux] 查看jar包内容
  16. echarts3Dearth 地球数据可视化添加 tooltip效果和涟漪扩散的效果
  17. Centos7之安装谷歌浏览器
  18. 三菱电梯最新调试软件,支持LEHY-PRO机型.
  19. CorelDRAWX4的VBA插件开发(二十七)使用C++制作动态连接库DLL辅助VBA构键强大功能-(1)前言和准备工作
  20. DT时代,大数据常用的软件工具有哪些?

热门文章

  1. iOS事件的响应和传递机制
  2. 微信 获取wx.config 参数 基类
  3. vc中关于 directx的配置,和dxsdk_extras(directshow)
  4. ASP.NET2.0 ObjectDataSource的使用详解
  5. 计算机网络(八)-数据链路层-帧封装
  6. 浅析Serverless
  7. 【剑指offer】面试题60:n个骰子的点数(Java)
  8. Leetcode--20. 有效的括号
  9. redis创建像mysql表结构_Redis数据结构列表实现
  10. 计算机二级vf上机试题,计算机二级VF上机模拟题