文档章节

数据库连接池浅析

wenqi_arthur
 wenqi_arthur
发布于 2015/03/13 16:17
字数 947
阅读 120
收藏 1

简介

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

数据库连接池生命周期

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

调用流程为:

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

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

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

  4. 应用读/写数据库

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

  6. 关闭socket

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

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

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

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

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

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();
}

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


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


为什么连接池快很多?

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

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


更快更安全

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

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

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

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


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


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

wenqi_arthur
粉丝 17
博文 69
码字总数 4580
作品 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
210
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

没有更多内容

加载失败,请刷新页面

加载更多

趣谈预留实例券,一文搞懂云上省钱最新玩法

摘要: 一文搞懂时髦的预留实例券(RI) ECS近期推出了预留实例券(Reserved Instances),简称RI,这东西很cool,今天我们聊聊这个。 首先这篇Blog不是文档,读完后想详细了解文档的朋友请点...

zhaowei121
21分钟前
0
0
js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析 将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之...

城市之雾
21分钟前
1
0
国外青少年最喜爱的聊天 app,竟然是 Google Docs

简评: 这还真不是标题党,Google Docs 的协作中内置了实时聊天的功能,也可以进行 comments,颇有种现代「传纸条」的既视感。其实国内的石墨文档、腾讯文档等协作工具也有类似的效果,本文很...

极光推送
26分钟前
0
0
用zuul将微服务的多个swagger api文档聚合成一个文档

1.在每个服务的pom中添加以下依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId></dependency> 注意:仅仅需要添加这个就行。zuul负......

xtof
27分钟前
0
0
为什么取不到metamask的账号?

当你使用Metamask测试以太坊DApp时,如果出现莫名其妙的问题,检查一下web3.eth.accounts是否可以获取到账户,如果不能获取的话,那么最大的可能是你使用了新版的Metamask,并且默认启用了隐...

汇智网教程
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部