数据库,Spring Boot,数据源
您是对的,我之前的回答解释了Spring Boot在操作MySQL时不一定需要显式配置指定的数据源类型,因为它有自动配置机制,但没有直接点明在自动配置情况下“数据源是什么”。
在Spring Boot自动配置机制下,这个“数据源”指的是一个连接池(Connection Pool)的实现。
以下是针对“数据源是什么”以及Spring Boot如何处理它的关键笔记:
Spring Boot 中的数据源(连接池)关键笔记 📝
-
数据源的本质:在Java应用(包括Spring Boot)中,当我们谈论“数据源 (DataSource)”时,通常指的是一个实现了
javax.sql.DataSource
接口的对象。这个对象的主要作用是作为数据库连接的工厂,更常见的是它封装了一个数据库连接池。 -
为什么需要连接池:
- 数据库连接的创建和销毁是昂贵的操作,耗时且消耗资源。
- 连接池预先创建并维护一定数量的数据库连接,当应用程序需要连接时,直接从池中获取,使用完毕后归还给池,而不是直接关闭。
- 这极大地提高了数据库操作的性能和效率,并能更好地管理数据库连接资源。
-
Spring Boot 自动配置的连接池:当你在
pom.xml
(Maven) 或build.gradle
(Gradle) 中加入了像spring-boot-starter-data-jpa
或spring-boot-starter-jdbc
这样的依赖,并且类路径中存在相应的数据库驱动(如mysql-connector-j
),Spring Boot会尝试按以下顺序自动配置一个连接池作为数据源:- HikariCP:如果HikariCP的库在类路径上,Spring Boot会优先选择它。HikariCP以其高性能、轻量级和可靠性而闻名,是Spring Boot 2.0及以后版本的默认选择(如果可用)。
- Tomcat JDBC Pool:如果HikariCP不可用,但Tomcat JDBC Pool(通常通过
spring-boot-starter-web
间接引入,因为它内嵌了Tomcat)在类路径上,则会使用它。 - Apache Commons DBCP2:如果以上两者都不可用,且Apache Commons DBCP2在类路径上,则会选用它。
-
如何知道当前使用的是哪个数据源:
- 启动日志:Spring Boot启动时,如果开启了DEBUG级别的日志(例如,在
application.properties
中设置logging.level.org.springframework.boot.autoconfigure.jdbc=DEBUG
或logging.level.com.zaxxer.hikari=DEBUG
),通常可以看到关于数据源配置的详细信息。 - Actuator端点:如果项目中引入了
spring-boot-starter-actuator
,可以通过访问/actuator/health
或/actuator/metrics
等端点来间接了解数据源的健康状况和一些指标,有时也能推断出具体类型。 - 代码检查:在代码中注入
javax.sql.DataSource
bean,然后打印dataSource.getClass().getName()
也能看到实际的类名。
- 启动日志:Spring Boot启动时,如果开启了DEBUG级别的日志(例如,在
-
显式指定数据源类型:正如之前笔记提到的,如果不想使用Spring Boot的自动选择,或者想使用不在上述优先级的其他连接池(比如阿里巴巴的Druid),可以通过在
application.properties
或application.yml
中设置spring.datasource.type
属性来显式指定,例如:spring.datasource.type=com.zaxxer.hikari.HikariDataSource # 或者 # spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
总结来说,在Spring Boot操作MySQL时,这个“数据源”通常是一个高性能的数据库连接池实现,如HikariCP,由Spring Boot根据类路径上的可用库自动配置和管理。开发者主要通过配置文件提供数据库的连接信息(URL、用户名、密码等)。