文档章节

数据库连接池浅析

 风中的呢喃
发布于 2015/10/30 15:27
字数 976
阅读 22
收藏 1

简介

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

数据库连接池生命周期

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

调用流程为:

  1. 应用数据层向DataSource请求数据库连接

  2. DataSource使用数据库Driver打开数据库连接

  3. 创建数据库连接,打开TCP socket

  4. 应用读/写数据库

  5. 如果该连接不再需要就关闭连接

  6. 关闭socket

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

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

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

我们来比较一下不使用连接池方法与使用HikariCP,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();
  
public void init() {
    MetricRegistry metricRegistry = new MetricRegistry();
    this.logReporter = Slf4jReporter
            .forRegistry(metricRegistry)
            .outputTo(LOGGER)
            .build();
    timer = metricRegistry.timer("connection");
}
  
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();
}

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


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


为什么连接池快很多?

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

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


更快更安全

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

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

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

所有这些优势都是有代价的,连接池配置的额外复杂性增加(尤其是大型企业级系统中)。所以没有银弹,你需要注意很多连接池配置比如:
- 最小连接数
- 最大连接数
- 最大空闲时间
- 获取连接超时时间
- 超时重试连接次数


原文链接: javacodegeeks 翻译: ImportNew.com hejiani
译文链接: http://www.importnew.com/11469.html

本文转载自: http://www.importnew.com/11469.html​

粉丝 0
博文 1
码字总数 0
作品 0
武汉
私信 提问
Asyncdb(一):写一个纯函数式的Mysql异步驱动

本文由 GodPan 发表在 ScalaCool 团队博客。 之前的 Akka系列博客 接下去可能并不会经常更新了,但是后续看到一些好的点或者大家对哪些还是比较感兴趣还会继续写几篇,这里先跟大家说明一下。...

ScalaCool
2017/10/09
0
0
连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法

原文:连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法 本文出处:http://www.cnblogs.com/wy123/p/6110349.html 之前遇到过这么一种情况:   连接数据库的部分Session会出现...

杰克.陈
2018/08/17
0
0
Apache Common-pool2对象池浅析

Apache Common-pool2包提供了一个通用的对象池技术的实现。可以很方便的基于它来实现自己的对象池,比如DBCP和Jedis他们的内部对象池的实现就是依赖于Common-pool2。 对象的创建和销毁在一定...

同明
2016/06/14
348
0
[玩转MySQL之二]MySQL连接机制浅析及运维

前言 使用MySQL数据库的第一步必然是建立连接登录,然后在上面执行SQL命令。无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了。那么就不经有几个疑问?...

沈欧邦
2018/09/06
0
0
netty高性能浅析

最近在看内部的rpc框架,感觉rpc最重要的就是高效的网络传输,所以学习netty的使用和原理极其重要,于是把netty的基础再总结一下。 首先我们先来看一下netty中的概念,熟悉了基本概念后再来进...

KKys
2017/08/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
今天
5
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
今天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
今天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
今天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
今天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部