1.定义
数据源(Data Source)是指在应用程序中用于获取数据库连接的对象,而连接池(Connection Pool)是数据源的一种实现方式,它是一个存储数据库连接的 “池子”。连接池负责创建、管理和维护数据库连接,当应用程序需要连接数据库时,直接从连接池中获取连接,使用完毕后再将连接归还给连接池,而不是每次都重新创建和销毁数据库连接。
2.数据源的作用
数据源是Java中定义的接口(javax.sql.DataSource
),数据源是为提高程序性能所出现的,它提供了以下核心功能:
-
统一管理数据库连接:封装数据库的配置信息(如URL、用户名、密码)。
-
连接复用:通过连接池避免频繁创建和销毁连接,提升性能。
-
事务管理:支持与Spring事务(如
@Transactional
)的集成。
3.连接池的意义
传统JDBC每次操作都创建新连接,存在性能瓶颈。连接池通过以下方式优化:
-
预创建连接:初始化时创建一定数量的连接,放入池中。
-
连接复用:应用需要时从池中获取,使用后归还,避免重复创建。
-
动态调整:根据负载自动扩展或收缩连接数。
4.工作原理
- 初始化连接池:在应用程序启动时,连接池会根据配置参数(如初始连接数、最大连接数等)创建一定数量的数据库连接,并将这些连接存储在连接池中。(事先实例化数据源,初始化部分连接资源)
- 获取连接:当应用程序需要与数据库进行交互时,会向连接池请求一个连接。连接池会从连接池中查找一个可用的连接(即处于空闲状态的连接),如果有可用连接,则将其返回给应用程序;如果没有可用连接,且当前连接数小于最大连接数,则连接池会创建一个新的连接并返回给应用程序;如果当前连接数已经达到最大连接数,则应用程序可能需要等待,直到有连接被释放。
- 使用连接:应用程序获取到连接后,可以使用该连接执行 SQL 语句,进行数据库的增删改查等操作。(使用连接资源时从数据源中获取)
- 归还连接:当应用程序完成数据库操作后,会将连接归还给连接池。连接池会检查连接的状态,如果连接正常,则将其标记为空闲状态,以便其他应用程序可以使用;如果连接出现问题,则会对连接进行处理(如关闭连接并重新创建)。(使用完毕后将连接资源归还给数据源)
- 连接池的管理:连接池会定期对连接进行检查和维护,例如检测连接的有效性、关闭空闲时间过长的连接等,以确保连接池中的连接始终处于可用状态。
5.常见的连接池技术
- C3P0:是一个开源的 JDBC 连接池,它实现了数据源和连接池的功能。C3P0 具有配置灵活、性能稳定等特点,支持自动回收空闲连接、自动处理连接超时等功能。
- DBCP(Database Connection Pool):是 Apache 软件基金会提供的一个开源连接池项目,它依赖于 Jakarta Commons Pool。DBCP 提供了简单易用的 API,并且性能较好,广泛应用于各种 Java 应用程序中。
- HikariCP:是一个高性能的 JDBC 连接池,它在性能方面表现出色,具有快速的连接获取速度和低资源消耗等优点。HikariCP 的配置简单,并且提供了丰富的监控和管理功能,逐渐成为许多项目的首选连接池。
- Druid:是阿里巴巴开源的一个功能强大的数据库连接池,它不仅提供了连接池的基本功能,还集成了 SQL 监控、SQL 防火墙、数据库性能分析等高级功能。Druid 具有良好的扩展性和可定制性,适用于各种规模的应用程序。
6.Spring配置数据源
6.1数据源的开发步骤
- 导入数据源的坐标和数据库驱动坐标
- 创建数据源对象
- 设置数据源的基本连接数据
- 使用数据源获取连接资源和归还连接资源