天天看点

【jdbc】数据库连接池(数据源)【汇总】1. 参考资料2. 为什么要连接池

文章目录

  • 1. 参考资料
    • 1.1 概述
    • 1.2 HikariCP
    • 1.3 Druid
    • 1.4 tomcat连接池
  • 2. 为什么要连接池
    • 2.1 需要注意的问题

1. 参考资料

1.1 概述

《高性能数据库连接池的内幕》介绍了为什么要使用连接池

《大话数据库连接池》 连接池的发展历史

《数据库连性池性能测试(hikariCP,druid,tomcat-jdbc,dbcp,c3p0)》 压力测试,不同连接池的性能对比

《数据库连接池优化配置(druid,dbcp,c3p0)》 介绍如何优化配置连接池,并给出3种连接池的参数介绍

1.2 HikariCP

在Spring Boot 2.0版本中,默认数据库池技术已从Tomcat Pool切换到HikariCP

《springBoot2.x中使用Hikari连接池详解》 简单介绍了如何配置HikariCP

1.3 Druid

《常见问题》Druid相关的问题汇总,介绍了相关的一些知识

《Druid连接池学习笔记》 比较详细的介绍用法

《SSM整合Druid数据库连接池》 类似一个helloworld那样的入门例子 ,通过xml配置实现的

《阿里Druid数据源 连接池》也是一个入门例子,是用JavaConfig写的

1.4 tomcat连接池

《Java连接池详解 tomcat》

《Tomcat 自带的 JDBC 连接池官方文档中文版》

2. 为什么要连接池

《【mysql】 入门例子》中展示了一个未用连接池的例子,使用手动创建的一个连接。

下面是Mysql数据库创建连接的的一段代码:

我们创建了一个Connection对象,它在内部都执行了什么:

  • 1.“DriverManager”检查并注册驱动程序;
  • 2.“com.mysql.jdbc.Driver”就是我们注册了的驱动程序,它会在驱动程序类中调用“connect(url…)”方法。
  • 3.com.mysql.jdbc.Driver的connect方法根据我们请求的“connUrl”,创建一个“Socket连接”,连接到IP为“your.database.domain”,默认端口3306的数据库。
  • 4.创建的Socket连接将被用来查询我们指定的数据库,并最终让程序返回得到一个结果。

简单的获取一个连接,系统却要在背后做很多消耗资源的事情,大多时候,创建连接的时间比执行sql语句的时间还要长。

【jdbc】数据库连接池(数据源)【汇总】1. 参考资料2. 为什么要连接池

用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

采用连接池技术后的过程如下:

【jdbc】数据库连接池(数据源)【汇总】1. 参考资料2. 为什么要连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

2.1 需要注意的问题

1、并发问题

为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)、lock(C#)关键字即可确保线程是同步的。

2、事务处理

我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。

我们知道当2个线程公用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。

3、连接池的分配与释放

连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他(如何能找到最合适的连接文章将在关键议题中指出);如果没有就抛出一个异常给用户,List中连接是否可以被分配由一个线程来专门管理。

4、连接池的配置与维护

连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConnection)和最大连接数(maxConnection)等参数来控制连接池中的连接。比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。

如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。