池化技术/连接池 - 学习/实践

1.应用场景

主要用于学习计算机软件开发中各种池化技术,其本质,底层实现,如何合理高效使用,从而开发高性能程序服务。

2.学习/操作

1.文档阅读

各种池

06 | 线程池基础:如何用线程池设计出更“优美”的代码?-极客时间

05 | 队列:队列在线程池等有限资源池中的应用-极客时间 -- 王争

18 | 如何设置线程池大小?-极客时间

07 | 封装线程池(上):初探泛型编程-极客时间

36 | Tomcat I/O和线程池的并发调优-极客时间

09 | 队列:队列在线程池等有限资源池中的应用-极客时间 -- 王争

41 | 案例分析(四):高性能数据库连接池HiKariCP-极客时间

33 | 临时对象池sync.Pool-极客时间

03 | 线程池:业务代码最常用也最容易犯错的组件-极客时间

08 | 封装线程池(下):从0到1,体验程序设计全过程-极客时间

34丨答疑篇:关于索引以及缓冲池的一些解惑-极客时间

02 | 内存池:如何提升内存分配的效率?-极客时间

24 | 冒险和预测(三):CPU里的“线程池”-极客时间

19 | 生成订单信息之一:应用JDBC池优化和内存溢出分析-极客时间

35|即学即练:如何实现一个轻量级线程池?-极客时间

第261期 | 队列在线程池等有限资源池中的应用-极客时间

04 | 连接池:别让连接池帮了倒忙-极客时间

池化

07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?-极客时间

08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?-极客时间

20 | 总结:Tomcat和Jetty中的对象池技术-极客时间

29 深度学习框架下的神经网络 | 见微知著:卷积神经网络-极客时间

119 | 基于深度学习的计算机视觉技术(二):基本的深度学习模型-极客时间

056 | 基于深度学习的搜索算法:卷积结构下的隐含语义模型-极客时间

中科院开源深度文本匹配工具MatchZoo-极客时间

谷歌开源语义图像分割模型DeepLab-v3+-极客时间

54 | 享元模式(上):如何利用享元模式优化文本编辑器的内存占用?-极客时间

十年,阿里云重构“计算”-极客时间

16 | 深度学习:当今最火的机器学习技术,你一定要知道-极客时间

18 | 分布式计算模式之流水线:你方唱罢我登场-极客时间

如何选择适合你的深度学习模型?-极客时间

NFV和SDN之间到底有什么关系?-极客时间

42丨当我们谈深度学习的时候,我们都在谈什么?-极客时间

55 | 云计算、容器革命与服务端的未来-极客时间

03 | 线程池:业务代码最常用也最容易犯错的组件-极客时间 -- 先看

10 | Pool:性能提升大杀器-极客时间

国外文章

https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing

关于池的大小设置,但是还是没说明白,CPU与线程,线程与连接的关系【尤其数量】的关系 --- 但还是建议一读

https://www.youtube.com/watch?v=_C77sBcAtSQ  // oracle 平台相关视频知识传递

2.整理输出

3W1H:What,When,Why and How

2.1 什么是池化技术

就是各种资源放到一个池子「Pool」中,随取随用,用完返还。

达到一种节约/复用资源,提升效率的效果。

如:

连接池,线程池,内存池,以及其他各种技术的池化名。

这是一种常见的软件设计思想,叫做池化技术,它的核心思想是空间换时间,期望使用预先创建好的对象来减少频繁创建对象的性能开销,同时还可以对对象进行统一的管理,降低了对象的使用的成本,总之是好处多多。

不过,池化技术也存在一些缺陷,比方说存储池子中的对象肯定需要消耗多余的内存,如果对象没有被频繁使用,就会造成内存上的浪费。

再比方说,池子中的对象需要在系统启动的时候就预先创建完成,这在一定程度上增加了系统启动时间。

可这些缺陷相比池化技术的优势来说就比较微不足道了,只要我们确认要使用的对象在创建时确实比较耗时或者消耗资源,并且这些对象也确实会被频繁地创建和销毁,我们就可以使用池化技术来优化。

2.2 为什么需要「应用场景」

本质上是为了复用资源,提升效率。

适用于短平快的场景,类似于,只用少量的高效的人去实现工作效率的最大化,可以想象一个小而美的公司。

2.3 什么时候出现「历史发展」

具体时间没找到「TBD」,但是通过上面的分析,可以知道池化技术的出现的原因。

2.4 怎样实践

连接池

数据库连接池「TCP连接池

数据库 - MySQL连接池 - 学习/实践_穿素白衫的中少年的博客-CSDN博客

HTTP连接池

TBD

线程池

TBD

内存池

TBD

插入

1. 在程序中,我们会用各种池化技术来缓存创建昂贵的对象,比如线程池、连接池、内存池。

一般是预先创建一些对象放入池中,使用的时候直接取出使用,用完归还以便复用,还会通过一定的策略调整池中缓存对象的数量,实现池的动态伸缩。

由于线程的创建比较昂贵,随意、没有控制地创建大量线程会造成性能问题,因此短平快的任务一般考虑使用线程池来处理,而不是直接创建线程。

2. 你回顾一下这两种技术,会发现它们都有一个共同点:

它们所管理的对象,无论是连接还是线程,它们的创建过程都比较耗时,也比较消耗系统资源。

所以,我们把它们放在一个池子里统一管理起来,以达到提升性能和资源复用的目的。

41 | 案例分析(四):高性能数据库连接池HiKariCP-极客时间

3. 在实际工作中,我们都是使用各种持久化框架「通常是数据库框架,如ORM框架」来完成数据库的增删改查,

基本上不会直接和数据库连接池打交道,为了能让你更好地理解数据库连接池的工作原理。

下面的示例代码并没有使用任何框架,而是原生地使用 HiKariCP。

执行数据库操作基本上是一系列规范化的步骤:

通过数据源获取一个数据库连接;

创建 Statement;

执行 SQL;

通过 ResultSet 获取 SQL 执行结果;


释放 ResultSet;


释放 Statement;


释放数据库连接。

下面的示例代码,通过 ds.getConnection() 获取一个数据库连接时,其实是向数据库连接池申请一个数据库连接,而不是创建一个新的数据库连接。

同样,通过 conn.close() 释放一个数据库连接时,也不是直接将连接关闭,而是将连接归还给数据库连接池。

// 数据库连接池配置
HikariConfig config = new HikariConfig();
config.setMinimumIdle(1);
config.setMaximumPoolSize(2);
config.setConnectionTestQuery("SELECT 1");
config.setDataSourceClassName("org.h2.jdbcx.JdbcDataSource");
config.addDataSourceProperty("url", "jdbc:h2:mem:test");

 

// 创建数据源
DataSource ds = new HikariDataSource(config);
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;

 

try {
  // 获取数据库连接
  conn = ds.getConnection();
  // 创建Statement 
  stmt = conn.createStatement();
  // 执行SQL
  rs = stmt.executeQuery("select * from abc");
  // 获取结果
  while (rs.next()) {
    int id = rs.getInt(1);
    ......
  }
} catch(Exception e) {
   e.printStackTrace();
} finally {
  // 关闭ResultSet
  close(rs);
  // 关闭Statement 
  close(stmt);
  // 关闭Connection
  close(conn);
}


// 关闭资源
void close(AutoCloseable rs) {
  if (rs != null) {
    try {
      rs.close();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

上面的数据库连接池实现,是java实现。

后续补充

...

3.问题/补充

1. 数据库连接池,以及PHP能否使用数据库连接池

PHP Swoole之mysql数据库连接池的实现 - 简书

PHP连接池详解-php教程-PHP中文网

https://stackoverflow.com/questions/39753/connection-pooling-in-php -- 推荐

PHP: 数据库持久连接 - Manual

https://blogs.oracle.com/opal/post/highly-scalable-connection-pooling-in-php

https://apache2.com/2.2.2/mod/mod_dbd.html

https://www.quora.com/Why-does-PHP-not-support-database-connection-pool。-- 为什么PHP不支持数据库连接池 -- 推荐

2. 持久化连接与连接池的区别?

PHP - 连接池相关问题 - 学习/实践_穿素白衫的中少年的博客-CSDN博客_php连接池

问题/补充 3

3. 问题:什么叫非线程平台,和线程平台?

TBD

4.参考

参见文档阅读列表

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值