MST

星途 面试题库

面试题:Java中常见数据库连接池的工作原理

请简述Java中如HikariCP、C3P0等常见数据库连接池的工作原理,包括连接的创建、管理、分配和回收等方面。
43.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

连接创建

  1. HikariCP
    • 启动时,根据配置的初始连接数,通过数据库驱动(如JDBC)创建物理数据库连接。它使用FastList来管理连接,采用预初始化策略,在启动时就创建一定数量的连接,减少首次获取连接的延迟。
    • 例如,配置initialPoolSize = 5,则启动时会立即创建5个数据库连接。
  2. C3P0
    • 同样在初始化时,依据配置参数创建一定数量的初始连接。它通过ComboPooledDataSource类来实现,会根据配置的initialPoolSize属性值创建相应数量的连接。例如设置initialPoolSize = 3,就会创建3个初始连接。

连接管理

  1. HikariCP
    • 使用ConcurrentBag来管理连接,这是一个线程安全的容器。连接池中的连接被封装成PoolEntry对象,ConcurrentBag通过ProducerConsumerQueueSynchronousQueue等数据结构来管理连接的存储和获取,提高并发性能。
    • 同时,HikariCP通过HouseKeeper线程定期检查连接的健康状态,移除失效连接并创建新连接来补充,以确保连接池中有足够的有效连接。
  2. C3P0
    • 使用PooledConnection对象来管理连接,将物理连接包装在其中。它有一个ConnectionPool来管理所有的PooledConnection,并通过配置参数如maxPoolSize(最大连接数)来限制连接池中的连接总数。同时,C3P0也有一个后台线程定期检查连接的有效性,对无效连接进行处理。

连接分配

  1. HikariCP
    • 当应用程序请求连接时,HikariDataSource.getConnection()方法被调用。它首先尝试从ConcurrentBag中获取一个空闲连接。如果有可用的空闲连接,直接返回;如果没有,则根据配置判断是否允许创建新连接(若当前连接数小于最大连接数maximumPoolSize),若允许则创建新连接返回给应用程序。
  2. C3P0
    • 应用程序调用ComboPooledDataSource.getConnection()获取连接。C3P0会从ConnectionPool中查找空闲的PooledConnection,若找到则返回该连接对应的物理连接给应用程序;若没有空闲连接且当前连接数未达到maxPoolSize,则创建新的连接返回。

连接回收

  1. HikariCP
    • 当应用程序调用Connection.close()方法时,HikariCP并不会真正关闭物理连接,而是将连接标记为空闲,放回ConcurrentBag中供其他请求复用。如果连接长时间未使用(可通过idleTimeout配置),HouseKeeper线程会将其关闭,以避免资源浪费。
  2. C3P0
    • 应用程序调用Connection.close()时,C3P0同样将连接归还给ConnectionPool,标记为空闲状态。C3P0通过配置maxIdleTime(最大空闲时间)来控制连接在空闲状态下的最长时间,超过此时间的连接会被关闭回收。