博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库连接池浅析
阅读量:2118 次
发布时间:2019-04-30

本文共 2084 字,大约阅读时间需要 6 分钟。

简介

我从事的所有项目都用到了数据库连接池,这样做自然有它的理由。有时我们可能忘记了使用或者某种特定技术的理由,这时就值得我们反思为什么要使用它。每项技术或者每个技术决策都有它的优势和不足,如果不了解其缺点,你需要知道你失去了什么。

数据库连接池生命周期

数据库每个读写操作需要一个连接。数据库连接调用流如下图:

connectionlifecycle

调用流程为:

  1. 应用数据层向DataSource请求数据库连接
  2. DataSource使用数据库Driver打开数据库连接
  3. 创建数据库连接,打开TCP socket
  4. 应用读/写数据库
  5. 如果该连接不再需要就关闭连接
  6. 关闭socket

容易推断出打开/关闭数据库连接是开销很大的操作。PostgreSQL为每个客户端连接产生一个,因此高频率地打开/关闭数据库连接会使数据库管理系统压力增大。

重用数据库连接最明显的原因是:

- 减少应用程序和数据库管理系统创建/销毁TCP连接的OS I/O开销
- 减少JVM对象垃圾

使用连接池 VS 不使用连接池

我们来比较一下不使用连接池方法与使用,HikariCP可能是目前最快的连接池框架。

该测试将打开和关闭1000个连接。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private
static
final
Logger LOGGER = LoggerFactory.getLogger(DataSourceConnectionTest.
class
);
 
private
static
final
int
MAX_ITERATIONS =
1000
;
 
private
Slf4jReporter logReporter;
 
private
Timer timer;
 
protected
abstract
DataSource getDataSource();
 
@Before
public
void
init() {
    
MetricRegistry metricRegistry =
new
MetricRegistry();
    
this
.logReporter = Slf4jReporter
            
.forRegistry(metricRegistry)
            
.outputTo(LOGGER)
            
.build();
    
timer = metricRegistry.timer(
"connection"
);
}
 
@Test
public
void
testOpenCloseConnections()
throws
SQLException {
    
for
(
int
i =
0
; i < MAX_ITERATIONS; i++) {
        
Timer.Context context = timer.time();
        
getDataSource().getConnection().close();
        
context.stop();
    
}
    
logReporter.report();
}

下面的图表为打开和关闭连接花费的时间,这个时间当然越短越好。

nopoolingvsconnectionpooling1

使用连接池不使用连接池快600倍。我们的企业系统包括几十个应用,一个批处理器系统仅仅能够处理每小时大于200万次数据库连接,所以2个数量级的优化是值得考虑的。

Type No Pooling Time (milliseconds) Connection Pooling Time (milliseconds)
min 74.551414 0.002633
max 146.69324 125.528047
mean 78.216549 0.128900
stddev 5.9438335 3.969438
median 76.150440 0.003218

为什么连接池快很多?

理解使用数据库连接池后运行如此好的原因,要分析池连接管理的调用流程:

poolingconnectionlifecycle

无论何时请求一个连接,池数据源会从可用的连接池获取新连接。仅当没有可用的连接而且未达到最大的连接数时连接池将创建新的连接。连接池的close()方法把连接返回到连接池而不是真正地关闭它。

connectionacquirerequeststates

更快更安全

连接池是即将到来的连接请求的有界缓冲区。如果出现瞬间流量尖峰,连接池会平缓这一变化,而不是使所有可用数据库资源趋于饱和。

等待步骤和超时机制是安全钩子(safety hook),防止数据库服务器过载。如果一个应用消耗太多数据库流量,为防止它将数据库服务器压垮(因此影响整个系统),连接池将减少它对数据库的使用。

更大的能力带来更多的职责

所有这些优势都是有代价的,连接池配置的额外复杂性增加(尤其是大型企业级系统中)。所以没有银弹,你需要注意很多连接池配置比如:

- 最小连接数
- 最大连接数
- 最大空闲时间
- 获取连接超时时间
- 超时重试连接次数

下一篇文章将研究企业级数据库连接池的挑战和如何帮助你找到合适的数据库连接池大小。

- 从获取代码

原文链接: 
 翻译: 

译文链接: 

本文由  -  翻译自 

转载地址:http://opeef.baihongyu.com/

你可能感兴趣的文章
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【面试】一份自我介绍模板
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>