Spring Boot 是当今最流行的 Java 开发框架之一,它以简洁、高效的特点帮助开发者快速构建稳健的应用程序。在实际项目中,涉及到数据库操作的需求时,我们需要对数据源进行整合。本文将重点介绍如何在 Spring Boot 中整合数据源,以及如何利用 Spring Boot 的便利特性来简化这一过程。
无论是传统的关系型数据库,还是当下流行的 NoSQL 数据库,Spring Boot 都提供了丰富的支持。通过本文的学习,读者将能够掌握在 Spring Boot 中整合各类数据源的方法,并且了解如何利用 Spring Boot 的自动配置和简化的注解来简化数据源配置工作,从而更专注于应用程序的业务逻辑开发。
如果你对 Spring Boot 中数据源整合的方法感到困惑,或者希望了解如何通过 Spring Boot 来更高效地处理数据库操作,那么本文将为你提供宝贵的指导和实用的技巧。让我们一起深入探索 Spring Boot 中数据源整合的精彩世界吧!
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-jdbc
org.projectlombok
lombok
com.alibaba
druid-spring-boot-starter
1.2.18
com.mysql
mysql-connector-j
runtime
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
paketobuildpacks/builder-jammy-base:latest
这是一个关于 Spring Boot 整合数据源的 Maven 依赖配置和构建插件示例。这些依赖项将帮助你在项目中使用 Spring Boot 和相关的数据库连接池进行数据源整合。以下是示例中包含的依赖项和插件说明:
spring-boot-starter
:Spring Boot 的核心依赖,提供了基本的 Spring Boot 功能。spring-boot-starter-jdbc
:Spring Boot 的 JDBC Starter,用于支持 JDBC 数据库操作。lombok
:Java 开发工具,简化了代码编写过程。druid-spring-boot-starter
:Druid 连接池的 Spring Boot Starter,用于管理数据库连接。mysql-connector-j
:MySQL 数据库的 JDBC 驱动。spring-boot-starter-test
:Spring Boot 的测试 Starter,用于编写单元测试。在构建部分,示例使用了
spring-boot-maven-plugin
插件来配置 Docker 镜像构建时所使用的镜像构建器。
# 数据源连接池
spring:
datasource:
# 连接属性
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/psm
username: root
password: 123456
# SpringBoot 内置的 hikari 连接池
hikari:
# 最小空闲连接
minimum-idle: 5
# 最大连接数
maximum-pool-size: 20
# 最大空闲时长
idle-timeout: 900000
# 连接的超时时间
connection-timeout: 3000
# 检查连接的有效性
connection-test-query: select 1
driver-class-name
:指定 JDBC 驱动类的完整类名,用于连接数据库。在示例中,我们使用了 MySQL 的驱动类com.mysql.cj.jdbc.Driver
。url
:指定数据库的连接 URL。在示例中,我们连接的是本地的 MySQL 数据库,监听端口为 3306,数据库名称为psm
。username
和password
:指定连接数据库所需的用户名和密码。接下来,我们配置了 Spring Boot 内置的 HikariCP 连接池相关的属性:
minimum-idle
:指定连接池中最小空闲连接数。在示例中,我们设置为 5,表示连接池中至少保持 5 个空闲连接。maximum-pool-size
:指定连接池中的最大连接数。在示例中,我们设置为 20,表示连接池中最多可以拥有 20 个连接。idle-timeout
:指定连接的最大空闲时长,超过该时长的空闲连接将被释放。在示例中,我们设置为 900000 毫秒(15 分钟)。connection-timeout
:指定连接的超时时间,即获取连接的最大等待时间。
connection-test-query
:这里可以指定一个用于测试连接是否有效的SQL查询语句,比如select 1
。连接池会定期执行这个查询来检测连接的有效性。
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
log.info("连接对象:" + connection);
}
}
这是一个简单的Junit测试类,用来验证你在Spring Boot应用中配置数据源连接池是否成功。以下是这个测试类的详细说明:
@Slf4j
注解:这个注解会自动生成一个名为log的日志对象,用来输出日志信息。
@SpringBootTest
注解:这个注解告诉JUnit测试框架,需要加载整个Spring应用上下文来执行测试。
@Autowired
注解:这个注解用来自动装配数据源连接池对象,也就是在Spring容器中查找一个数据源对象并将其注入到dataSource变量中。
contextLoads()
方法:这个方法是一个测试用例,用来测试数据源连接池是否正常工作。在这个方法中,你调用了dataSource.getConnection()
方法获取一个数据库连接,并使用log.info()
方法输出这个连接对象。当你运行这个测试类时,如果能够正常输出连接对象,就说明你已经成功地配置了数据源连接池,并且能够使用它来管理数据库连接了。
运行结果:
# 数据源连接池
spring:
datasource:
# 连接属性
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/psm
username: root
password: 123456
# 使用 druid 连接池
druid:
# 最大连接数
max-active: 100
# 初始化连接数
initial-size: 10
# 最小连接池数
min-idle: 10
# 最大等待时间
max-wait: 1000
# 如果连接空闲时间大于等于( min-evictable-idle-time-millis)
# 的时长则关闭连接
time-between-eviction-runs-millis: 60000
# 连接保持空闲而不被驱逐出连接池
min-evictable-idle-time-millis: 300000
# 检查连接有效性
validation-query: select 1
# 是否缓存 preparedStatement (MySQL 建议关闭)
pool-prepared-statements: false
以下是一些重要的设置说明:
driver-class-name
、url
、username
和password
:这些属性指定了数据库连接的基本信息,包括驱动类名、数据库URL、用户名和密码。
druid.max-active
:这个属性指定了连接池中允许的最大活动连接数,即最大连接池大小。
druid.initial-size
:这个属性指定了连接池的初始大小,即在连接池刚刚创建时,连接池中包含的连接数。
druid.min-idle
:这个属性指定了连接池中保持的最小空闲连接数。
druid.max-wait
:当连接池中没有可用连接时,客户端在等待连接时最长的时间,单位为毫秒。
druid.time-between-eviction-runs-millis
:用于检测连接池中空闲连接的时间间隔,单位为毫秒。如果连接空闲时间大于等于min-evictable-idle-time-millis
的时长,则关闭连接。
druid.min-evictable-idle-time-millis
:连接保持空闲而不被驱逐出连接池的时长,单位为毫秒。
druid.validation-query
:用来检测连接是否有效的SQL查询语句,例如select 1
。
druid.pool-prepared-statements
:是否缓存prepared statements,对于MySQL数据库,建议将此属性设置为false。
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {
@Autowired
private DataSource dataSource;
/**
* 注入 JDBC 的 Template,用于操作数据
*/
@Autowired
private JdbcTemplate template;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
log.info("连接对象:" + connection);
}
@Test
public void testJdbcTemplate(){
List
这段代码是一个Spring Boot的测试类,用于测试数据源和JdbcTemplate是否能够正常工作。
首先,在
@Autowired
注解下,DataSource
对象被注入到测试类中。这个数据源对象可以用来获取数据库连接,在contextLoads
方法中,通过调用dataSource.getConnection()
方法获得了一个数据库连接对象,然后在日志中记录了这个连接对象。另外,在
testJdbcTemplate
方法中,可以看到JdbcTemplate
对象也被注入到测试类中。JdbcTemplate
是Spring框架提供的一个用于简化JDBC操作的工具类,可以用它来执行SQL查询、更新等操作。在这个方法中,使用了template.queryForList
方法查询了psm.city_info
表的前10行数据,并打印出了每一行数据中的键值对。通过这些测试,可以验证数据源和JdbcTemplate是否已经正确配置和注入到Spring容器中,以及它们是否能够正常地连接和操作数据库。如果测试通过,则说明你已经成功地配置了数据源和JdbcTemplate,并能够使用它们来操作数据库。
运行结果:
Hikari和Druid都是Java语言中常用的数据库连接池。它们之间的不同主要体现在以下几个方面:
性能和效率: HikariCP通常被认为是性能最好的连接池之一,因为它专注于快速、轻量级和高效的连接管理。相比之下,Druid虽然功能强大,但在某些情况下可能会牺牲一些性能以换取更多的特性和功能。
配置和简洁性: HikariCP的配置相对简单,通常只需要很少的参数设置就可以工作良好。而Druid提供了更多的配置选项和功能,这使得它在一些复杂的场景下更具灵活性,但也增加了学习和配置的复杂性。
监控和扩展性: Druid内置了丰富的监控和统计功能,可以方便地查看连接池的状态和性能指标。此外,Druid还提供了诸如防火墙、SQL转义等额外的功能,这些功能在HikariCP中可能需要额外的集成或扩展。
综上所述,HikariCP适合那些追求高性能、简洁配置的场景,而Druid则适合那些对监控和扩展性有较高要求的场景。选择哪个连接池取决于具体的项目需求和性能考量。