04-HikariCP连接池学习笔记

1. 数据库连接池的整合

1)何为连接池?(内存中一块存储“可重用对象”的空间);

2)为什么使用连接池?(提高其性能-反复创建和销毁连接会带来很大的性能损耗);

3)为什么创建连接和销毁连接会有很大的性能损耗?(底层建立连接使用TCP/IP协议,基于此协议创建连接需要三次握手,释放连接需要四次挥手);

问题思考:

在C/S架构中,如何提高服务端响应的数据速度(降低响应时间)?

影响其响应性能(响应时间)的因素有哪些?

1)请求数据的传输时间?(数据量-压缩,带宽)

2)请求数据的处理时间?(架构,算法,CPU,磁盘)

3)响应数据的传输时间?(数据量-压缩,带宽,缓存)

4)响应数据的渲染时间?(html,css,js,images)

2. 池化思想

池化思想是我们项目开发过程中的一种非常重要的思想,如字符串池,整数池,对象池,线程池等都是池化思想的一种应用,都是通过复用对象,以减少因创建和释放对象所带来的资源消耗,进而来提升系统性能。例如Integer对象的内部池应用,代码如下:

packagecom.zhf.java.pool;

publicclassTestInteger01{

publicstaticvoidmain(String[]args) {

    inta=10;

Integerb=10;

Integerb2=10;

Integerc=newInteger(10);

Integerc2=newInteger(10);

Integerd=Integer.valueOf("127");

Integere=Integer.valueOf(127);

Integeree=Integer.valueOf(127);

Integerf=Integer.valueOf(128);

Integerff=Integer.valueOf(128);

System.out.println(a==b);// true:int和Integer会自动转型比较int数值

System.out.println(b==b2);// true:虽然是引用,但是都是从Integer默认缓存池取出

System.out.println(b==c);// false:栈中常量和堆中对象

System.out.println(c==c2);// false:不同对象地址不同

System.out.println(b.equals(c));// true:值相同

System.out.println(d==e);// true:Integer.valueOf取出缓存池的对象

System.out.println(e==ee);// true:默认缓存池

System.out.println(f==ff);// false:常量池范围是-128~127,128超出常量池范围

   }


}

3. 如果让你设计一个连接池,你会考虑哪些问题?

1)池的存储结构(物理存储结构)?(数组,链表)

2)从池中借,还连接的算法?

3)当池中没有连接时,基于什么方式处理连接请求?

4)池是可以共享的,我们需要考虑池在访问时的并发安全?

HikariCP底层存储连接使用的是数组结构,借和还都是随机的,线程安全应用到CAS算法

底层是CopyOnWriteArrayList()方法

4. Java中连接池的规范是什么?为什么要有规范?

1) 规范的定义:javax.sql.DataSource2) 使用规范可以让代码更严谨,其可维护性也会更好。

Java编程领域中所有连接池提供方,必须实现DataSource接口,后续我们编程时,可以通过此接口获取具体连接池对象。

5. Java中具体是哪个对象负责建立与数据库的连接?( Driver)

SpringBoot工程中想使用HikariCP连接池应该如何实现?

添加依赖(mysql , spring - data - JDBC)

配置连接数据库的url , username , password

在程序中耦合DataSource接口获取具体数据源对象

6. SpringBoot工程中基于HikariCP实现JDBC操作?

packagecom.zhf.goods.dao;

​importorg.slf4j.Logger;

importorg.slf4j.LoggerFactory;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Repository;

​importjavax.sql.DataSource;

importjava.sql.*;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.List;

importjava.util.Map;

/**

* @author zhf

* @version 1.0

* @date 2020/12/1

*/

@Repository

publicclassDefaultGoodsDaoimplementsGoodsDao{

@Autowired

privateDataSourcedataSource;

privatestaticfinalLoggerlog=

LoggerFactory.getLogger(DefaultGoodsDao.class);

Map<String,Object>rowMap(ResultSetMetaDatarsmd,ResultSetrs)throwsSQLException{

Map<String,Object>map=newHashMap<>();

for(inti=1;i<=rsmd.getColumnCount();i++) {

map.put(rsmd.getColumnName(i),rs.getObject(rsmd.getColumnName(i)));

       }

returnmap;

   }

@Override

publicList<Map<String,Object>>findGoods() {

Connectionconn=null;

Statementstatement=null;

ResultSetrs=null;

Stringsql="select * from tb_goods";

try{

conn=dataSource.getConnection();

statement=conn.createStatement();

rs=statement.executeQuery(sql);

List<Map<String,Object>>list=newArrayList<>();

ResultSetMetaDatarsmd=rs.getMetaData();

while(rs.next()) {

//                Map<String,Object> map = new HashMap<>();

//                map.put("id",rs.getInt("id"));

//                map.put("name", rs.getString("name"));

//                map.put("remark", rs.getString("remark"));

//                map.put("createdTime", rs.getTimestamp("createdTime"));

//                list.add(map);

list.add(rowMap(rsmd,rs));

           }

returnlist;

}catch(SQLExceptione) {

e.printStackTrace();

//            log.info("查询异常!!" + e.getMessage());

log.error("查询异常,{}",e.getMessage());//{}表示占位符

thrownewRuntimeException("数据查询失败"+e.getMessage());//转换为非检查异常(编译时不检测的异常)

}finally{

//            if (rs != null) try {

//                rs.close();

//            } catch (Exception e) {

//                e.printStackTrace();

//            }

//            if (statement != null) try {

//                statement.close();

//            } catch (Exception e) {

//                e.printStackTrace();

//            }

//            if (conn != null) try {

//                conn.close();

//            } catch (Exception e) {

//                e.printStackTrace();

//            }

close(rs,statement,conn);

       }

   }

publicvoidclose(ResultSetrs,Statementstatement,Connectionconn) {

if(rs!=null)try{

rs.close();

}catch(Exceptione) {

e.printStackTrace();

       }

if(statement!=null)try{

statement.close();

}catch(Exceptione) {

e.printStackTrace();

       }

if(conn!=null)try{

conn.close();

}catch(Exceptione) {

e.printStackTrace();

       }

   }

}

/**优点:

* 1)代码简单

* 2)使用了连接池,优化了建立连接的过程,从池中获取连接,提高了数据访问性能

* 3)使用了Map做映射,简化了pojo对象定义

*

* 缺点:

* 1) 可重用性比较差(如资源释放代码,可以封装)

* 2) 行映射不够灵活,太僵硬

* 3) 异常的处理不能简单打印一下

* 4) Map封装数据时值的类型不可控(建议后续修改为pojo对象)

* 5)  对共性模板应该进行封装,特性代码进行提取

* */

总结

总之,数据库连接池的为我们的项目开发及运行带来了很多优点,具体如下:

资源重用更佳。

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

系统调优更简便。

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

系统响应更快。

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

连接管理更灵活。

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容