面试题答案
一键面试连接创建
- HikariCP:
- 启动时,根据配置的初始连接数,通过数据库驱动(如JDBC)创建物理数据库连接。它使用FastList来管理连接,采用预初始化策略,在启动时就创建一定数量的连接,减少首次获取连接的延迟。
- 例如,配置
initialPoolSize = 5
,则启动时会立即创建5个数据库连接。
- C3P0:
- 同样在初始化时,依据配置参数创建一定数量的初始连接。它通过
ComboPooledDataSource
类来实现,会根据配置的initialPoolSize
属性值创建相应数量的连接。例如设置initialPoolSize = 3
,就会创建3个初始连接。
- 同样在初始化时,依据配置参数创建一定数量的初始连接。它通过
连接管理
- HikariCP:
- 使用
ConcurrentBag
来管理连接,这是一个线程安全的容器。连接池中的连接被封装成PoolEntry
对象,ConcurrentBag
通过ProducerConsumerQueue
和SynchronousQueue
等数据结构来管理连接的存储和获取,提高并发性能。 - 同时,HikariCP通过
HouseKeeper
线程定期检查连接的健康状态,移除失效连接并创建新连接来补充,以确保连接池中有足够的有效连接。
- 使用
- C3P0:
- 使用
PooledConnection
对象来管理连接,将物理连接包装在其中。它有一个ConnectionPool
来管理所有的PooledConnection
,并通过配置参数如maxPoolSize
(最大连接数)来限制连接池中的连接总数。同时,C3P0也有一个后台线程定期检查连接的有效性,对无效连接进行处理。
- 使用
连接分配
- HikariCP:
- 当应用程序请求连接时,
HikariDataSource.getConnection()
方法被调用。它首先尝试从ConcurrentBag
中获取一个空闲连接。如果有可用的空闲连接,直接返回;如果没有,则根据配置判断是否允许创建新连接(若当前连接数小于最大连接数maximumPoolSize
),若允许则创建新连接返回给应用程序。
- 当应用程序请求连接时,
- C3P0:
- 应用程序调用
ComboPooledDataSource.getConnection()
获取连接。C3P0会从ConnectionPool
中查找空闲的PooledConnection
,若找到则返回该连接对应的物理连接给应用程序;若没有空闲连接且当前连接数未达到maxPoolSize
,则创建新的连接返回。
- 应用程序调用
连接回收
- HikariCP:
- 当应用程序调用
Connection.close()
方法时,HikariCP并不会真正关闭物理连接,而是将连接标记为空闲,放回ConcurrentBag
中供其他请求复用。如果连接长时间未使用(可通过idleTimeout
配置),HouseKeeper
线程会将其关闭,以避免资源浪费。
- 当应用程序调用
- C3P0:
- 应用程序调用
Connection.close()
时,C3P0同样将连接归还给ConnectionPool
,标记为空闲状态。C3P0通过配置maxIdleTime
(最大空闲时间)来控制连接在空闲状态下的最长时间,超过此时间的连接会被关闭回收。
- 应用程序调用