前言
Pooling我们可以简单理解为“连接池”。
IO是很珍贵的资源,尤其是在高并发的场景下,每次IO(网络、磁盘等)创建销毁产生的开销是足以影响到整个服务(应用)的性能。
此时,采用pooling技术,可以对频繁的IO操作进行统一管理,日常应用中,我们常见的有如下几个场景:
- 数据库连接 -> 采用数据库连接池
- Nosql(如Redis) -> Redis采用连接池
- Http请求 -> HttpClient 采用连接池
- 线程 -> 多线程采用线程池
举例
1. 数据库连接池
最原始的,采用jdbc进行数据库crud操作,每次需要利用驱动,创建一个连接。
繁琐的进行创建和关闭操作,代码不清晰并且难以维护,最重要的,性能差!
目前,针对某个数据库,我们通常配置一个数据源,其中数据源的实现有很多,通过比较,目前还是推荐使用alibaba的druid
一个典型的配置:
再此之上,可以扩展实现主从、多读、分库分表等多数据源的场景配置,必要的时候可使用一些分布式中间件,如:当当开源的sharding-jdbc
2. Redis采用连接池
java这边redis的类库主要有2个:Jedis 以及 Lettuce
后者我们一般习惯直接引用spring-data项目的配置,这里介绍下jedis的使用
|
|
3. Http请求:ApacheHttpClient连接池
http请求一般我们有2个选择:
- java自带的HttpURLConnection
- apache httpclient - 注意:采用最新的版本,与旧版完全是两个东西!
不考虑性能,我们当然可以每次请求都建立一个连接,进行操作后再销毁。但是实际业务中,往往面对的都是高并发频繁的调用,每次创建和销毁显然不现实。
因此,可以自行封装一个http请求工具,根据业务需要预设一定数量的连接,并开放工具方法。
|
|
4. 线程池
高并发的场景下,每次有请求来临,不可能单独创建一个thread,这时候通常采用线程池,主要是2个思路:
- 简单情况下,直接利用Executors工具类,选择合适的实现
这部分可以参考:Java线程池-Executors
- 自定义,根据业务配置具体的参数,自行调优
这部分可以参考:Java线程池-自定义