Spring Boot 是当今最流行的 Java 开发框架之一,它以简洁、高效的特点帮助开发者快速构建稳健的应用程序。在实际项目中,涉及到数据库操作的需求时,我们需要对数据源进行整合。本文将重点介绍如何在 Spring Boot 中整合数据源,以及如何利用 Spring Boot 的便利特性来简化这一过程。
无论是传统的关系型数据库,还是当下流行的 NoSQL 数据库,Spring Boot 都提供了丰富的支持。通过本文的学习,读者将能够掌握在 Spring Boot 中整合各类数据源的方法,并且了解如何利用 Spring Boot 的自动配置和简化的注解来简化数据源配置工作,从而更专注于应用程序的业务逻辑开发。
如果你对 Spring Boot 中数据源整合的方法感到困惑,或者希望了解如何通过 Spring Boot 来更高效地处理数据库操作,那么本文将为你提供宝贵的指导和实用的技巧。让我们一起深入探索 Spring Boot 中数据源整合的精彩世界吧!
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starterartifactId>
- dependency>
-
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-jdbcartifactId>
- dependency>
-
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- dependency>
-
-
-
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druid-spring-boot-starterartifactId>
- <version>1.2.18version>
- dependency>
-
- <dependency>
- <groupId>com.mysqlgroupId>
- <artifactId>mysql-connector-jartifactId>
- <scope>runtimescope>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <configuration>
- <image>
- <builder>paketobuildpacks/builder-jammy-base:latestbuilder>
- image>
- configuration>
- plugin>
- plugins>
- build>
这是一个关于 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
- list.forEach(map -> map.forEach((k,v) -> {
- log.info("键:" + k +" " + "值:" + v);
- }) );
- }
-
- }
这段代码是一个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则适合那些对监控和扩展性有较高要求的场景。选择哪个连接池取决于具体的项目需求和性能考量。