数据库连接池

        程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对连接池中的连接进行申请,使用,释放。

使用数据库连接池的机制

  1. 程序初始化时创建连接池
  2. 使用时向数据库申请可用连接
  3. 使用完毕,将连接返回给连接池
  4. 程序退出时,断开所有连接,并释放资源

        数据库连接池负责分配,管理和释放数据库的连接,它允许应用程序重复使用一个现有的数据库连接,而不是重建一个,极大地节省了数据库资源。

连接池的连接数量

        数据在连接的数量上是由最小数据库连接数来设定的,无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量,连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数。当应用程序向连接池请求连接数量超过最大连接数量时,这些请求将被加入到等待队列中。

使用数据库连接池的关键点

  • 并发问题
  • 事务处理

              DB连接池必须要确保某一时间内一个connection只能分配给一个线程。

  • 连接池的分配与释放
  • 连接池的配置与维护

SpringBoot项目上部署MySQL的Druid连接池

pom.xml文件的配置

<!--druid连接池依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

  application.properties文件的配置  

#数据源基本配置
spring.datasource.druid.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.username=root
spring.datasource.druid.password=Pw123456
spring.datasource.druid.db-type=com.alibaba.druid.pool.DruidDataSource
#   数据源其他配置
spring.datasource.druid.initial-size=5    #池启动时创建的连接数量
spring.datasource.druid.min-idle=5       #池中保持空闲的最小连接数
spring.datasource.druid.max-active=20    #同一时间可从池中分配的最多连接数,如果设置为0,表示无限制
spring.datasource.druid.max-wait=60000   #在为抛出异常之前,池连接等待回收的最大时间,如果设置为-1,表示无限制
spring.datasource.druid.time-between-eviction-runs-millis=60000    #空闲连接回收的时间间隔,与test-while-idle一起使用    
spring.datasource.druid.min-evictable-idle-time-millis=300000      #连接池空闲连接的有效时间
spring.datasource.druid.validation-query=SELECT 1 FROM test
spring.datasource.druid.test-while-idle=true    #验证连接的有效性
spring.datasource.druid.test-on-borrow=true     #获取连接时候验证
spring.datasource.druid.test-on-return=false    #在连接归还到连接池时是否测试该连接
spring.datasource.druid.pool-prepared-statements=true    #是否对预处理语句进行池管理

创建Druid的配置文件让配置生效

@Configuration
public class DruidConfiguration {
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    @Bean
    public DruidDataSource druidDataSource(){
        return new DruidDataSource();
    }
}