HTTP连接池、线程池、数据库连接池、ThreadPoolExecutor

本文介绍了HTTP连接池和数据库连接池的重要性。HTTP连接池通过减少重复建立和关闭连接的时间损耗,降低了延迟并支持更大并发。数据库连接池通过预先建立并维护一定数量的连接,避免了频繁创建和销毁连接带来的性能损失。

一、为什么要用Http连接池

1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗,别小看这几次握手,本人经过测试发现,基本上3倍的时间延迟

2、支持更大的并发:如果不采用连接池,每次连接都会打开一个端口,在大并发的情况下系统的端口资源很快就会被用完,导致无法建立新的连接

一、 线程池的原理:     

线程池,究竟是怎么一回事?其实线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:

先启动若干数量的线程,并让这些线程都处于睡眠状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。

可能你也许会问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但你却忽略了一个重要的问题——性能

就拿我所在的单位来说,我的单位是一个省级数据大集中的银行网络中心,高峰期每秒的客户端请求并发数超过100,如果为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。

 ThreadPoolExecutor

http://www.importnew.com/19011.html


二、 数据库连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。 数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待。并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数。 

连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

1)  最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费; 
2)  最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。


<think>我们被要求使用中文回答问题,并且回答后必须提出3-5个相关问题,以“§§相关问题§§”开头。 用户的问题是关于“araths查看线程池数据库连接池”,但“araths”可能是拼写错误。根据上下文,我们推测可能是“Arthas”,因为Arthas是阿里巴巴开源的Java诊断工具,常用于监控JVM、线程、连接池等。 因此,我们将问题理解为:如何使用Arthas查看线程池数据库连接池的状态? 回答步骤: 1. 介绍Arthas的基本使用。 2. 给出查看线程池的命令。 3. 给出查看数据库连接池的命令(以常见的Druid或HikariCP为例)。 4. 注意事项。 然后,根据问题和回答提出3-5个相关问题。 注意:由于Arthas的具体输出可能因应用使用的连接池不同而有所差异,这里给出通用方法。 </think>以下是使用 **Arthas**(阿里巴巴开源的 Java 诊断工具)查看线程池数据库连接池状态的完整指南: --- ### 一、线程池监控 #### 1. 查看所有线程池 ```bash # 进入 Arthas 控制台后执行 thread --all | grep 'pool' # 筛选线程池 ``` #### 2. 分析特定线程池状态 ```bash # 查看线程池详细信息(替换 [hashcode]) watch java.util.concurrent.ThreadPoolExecutor [hashcode] '{params,activeCount,poolSize,queue.size}' ``` 输出示例: ```java @ArrayList[ @Object[][isEmpty=false;size=5], // 参数 @Integer[8], // 活跃线程数 @Integer[10], // 总线程数 @Integer[23] // 队列任务数 ] ``` #### 3. 关键指标说明 | 指标 | 说明 | 健康值 | |---------------|--------------------------|---------------------| | `activeCount` | 正在执行任务的线程数 | 应小于 `poolSize` | | `poolSize` | 当前线程池大小 | 根据业务动态调整 | | `queue.size` | 等待队列中的任务数 | 持续增长说明积压风险 | --- ### 二、数据库连接池监控(以 Druid 为例) #### 1. 查看连接池状态 ```bash # 查找 DruidDataSource 实例 sc -d *DruidDataSource* # 监控连接池(替换 [hashcode]) watch com.alibaba.druid.pool.DruidDataSource [hashcode] '{activeCount,poolingCount,maxActive,waitThreadCount}' ``` 输出示例: ```java @ArrayList[ @Integer[5], // 活跃连接数 @Integer[8], // 空闲连接数 @Integer[20], // 最大连接数 @Integer[0] // 等待线程数 ] ``` #### 2. 关键阈值警报 ```bash # 监控等待线程(>0 说明连接不足) watch com.alibaba.druid.pool.DruidDataSource [hashcode] 'waitThreadCount' -x 3 -n 5 ``` --- ### 三、通用诊断命令 1. **实时监控线程堆栈**: ```bash dashboard -i 2000 # 每2秒刷新 ``` ![仪表盘视图](https://arthas.aliyun.com/doc/dashboard.png) 2. **连接池泄漏检测**: ```bash trace *DataSource* getConnection '#cost > 1000' # 跟踪超时连接 ``` --- ### 四、常见问题诊断 | 现象 | 可能原因 | Arthas 命令 | |---------------------|---------------------------|--------------------------------| | 线程池任务积压 | 队列过长/线程不足 | `thread pool > queue.size` | | 数据库连接超时 | 连接泄漏/最大连接数过小 | `watch DruidDataSource activeCount` | | CPU 飙高 | 线程死锁/无限循环 | `thread -b` | > **注**:需先启动 Arthas 并附加到目标 Java 进程: > ```bash > java -jar arthas-boot.jar > # 选择目标进程编号 > ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值