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+-极客时间
十年,阿里云重构“计算”-极客时间
16 | 深度学习:当今最火的机器学习技术,你一定要知道-极客时间
18 | 分布式计算模式之流水线:你方唱罢我登场-极客时间
如何选择适合你的深度学习模型极客时间
NFV和SDN之间到底有什么关系极客时间
42丨当我们谈深度学习的时候,我们都在谈什么极客时间
55 | 云计算、容器革命与服务端的未来-极客时间
03 | 线程池:业务代码最常用也最容易犯错的组件-极客时间 — 先看
10 | Pool:性能提升大杀器-极客时间
国外文章
https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing
关于池的大小设置,但是还是没说明白,CPU与线程,线程与连接的关系【尤其数量】的关系 — 但还是建议一读
https://www.youtube.com/watch=_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实现。
后续补充
…
|