数据库链接池浅析

简介

我从事的全部项目都用到了数据库链接池,这样作天然有它的理由。有时咱们可能忘记了使用设计模式或者某种特定技术的理由,这时就值得咱们反思为何要使用它。每项技术或者每一个技术决策都有它的优点和不足,若是不了解其缺点,你须要知道你失去了什么。 html

数据库链接池生命周期

数据库每一个读写操做须要一个链接。数据库链接调用流以下图: java

调用流程为: git

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

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

  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

相关文章
相关标签/搜索