SpringBoot?整合數(shù)據(jù)源的具體實(shí)踐
前言
Spring Boot 是當(dāng)今最流行的 Java 開(kāi)發(fā)框架之一,它以簡(jiǎn)潔、高效的特點(diǎn)幫助開(kāi)發(fā)者快速構(gòu)建穩(wěn)健的應(yīng)用程序。在實(shí)際項(xiàng)目中,涉及到數(shù)據(jù)庫(kù)操作的需求時(shí),我們需要對(duì)數(shù)據(jù)源進(jìn)行整合。本文將重點(diǎn)介紹如何在 Spring Boot 中整合數(shù)據(jù)源,以及如何利用 Spring Boot 的便利特性來(lái)簡(jiǎn)化這一過(guò)程。
無(wú)論是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),還是當(dāng)下流行的 NoSQL 數(shù)據(jù)庫(kù),Spring Boot 都提供了豐富的支持。通過(guò)本文的學(xué)習(xí),讀者將能夠掌握在 Spring Boot 中整合各類(lèi)數(shù)據(jù)源的方法,并且了解如何利用 Spring Boot 的自動(dòng)配置和簡(jiǎn)化的注解來(lái)簡(jiǎn)化數(shù)據(jù)源配置工作,從而更專(zhuān)注于應(yīng)用程序的業(yè)務(wù)邏輯開(kāi)發(fā)。
如果你對(duì) Spring Boot 中數(shù)據(jù)源整合的方法感到困惑,或者希望了解如何通過(guò) Spring Boot 來(lái)更高效地處理數(shù)據(jù)庫(kù)操作,那么本文將為你提供寶貴的指導(dǎo)和實(shí)用的技巧。讓我們一起深入探索 Spring Boot 中數(shù)據(jù)源整合的精彩世界吧!
一、前期準(zhǔn)備
1、新建項(xiàng)目,結(jié)構(gòu)如下

2、導(dǎo)入依賴(lài)
<dependencies>
<!-- spring boot 的核心starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- spring jdbc 的 starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- Druid 連接池的 starter -->
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<builder>paketobuildpacks/builder-jammy-base:latest</builder>
</image>
</configuration>
</plugin>
</plugins>
</build>
這是一個(gè)關(guān)于 Spring Boot 整合數(shù)據(jù)源的 Maven 依賴(lài)配置和構(gòu)建插件示例。這些依賴(lài)項(xiàng)將幫助你在項(xiàng)目中使用 Spring Boot 和相關(guān)的數(shù)據(jù)庫(kù)連接池進(jìn)行數(shù)據(jù)源整合。以下是示例中包含的依賴(lài)項(xiàng)和插件說(shuō)明:
spring-boot-starter:Spring Boot 的核心依賴(lài),提供了基本的 Spring Boot 功能。spring-boot-starter-jdbc:Spring Boot 的 JDBC Starter,用于支持 JDBC 數(shù)據(jù)庫(kù)操作。lombok:Java 開(kāi)發(fā)工具,簡(jiǎn)化了代碼編寫(xiě)過(guò)程。druid-spring-boot-starter:Druid 連接池的 Spring Boot Starter,用于管理數(shù)據(jù)庫(kù)連接。mysql-connector-j:MySQL 數(shù)據(jù)庫(kù)的 JDBC 驅(qū)動(dòng)。spring-boot-starter-test:Spring Boot 的測(cè)試 Starter,用于編寫(xiě)單元測(cè)試。
在構(gòu)建部分,示例使用了 spring-boot-maven-plugin 插件來(lái)配置 Docker 鏡像構(gòu)建時(shí)所使用的鏡像構(gòu)建器。
二、使用 yml 配置SpringBoot 內(nèi)置的 hikari 連接池
# 數(shù)據(jù)源連接池
spring:
datasource:
# 連接屬性
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/psm
username: root
password: 123456
# SpringBoot 內(nèi)置的 hikari 連接池
hikari:
# 最小空閑連接
minimum-idle: 5
# 最大連接數(shù)
maximum-pool-size: 20
# 最大空閑時(shí)長(zhǎng)
idle-timeout: 900000
# 連接的超時(shí)時(shí)間
connection-timeout: 3000
# 檢查連接的有效性
connection-test-query: select 1driver-class-name:指定 JDBC 驅(qū)動(dòng)類(lèi)的完整類(lèi)名,用于連接數(shù)據(jù)庫(kù)。在示例中,我們使用了 MySQL 的驅(qū)動(dòng)類(lèi)com.mysql.cj.jdbc.Driver。url:指定數(shù)據(jù)庫(kù)的連接 URL。在示例中,我們連接的是本地的 MySQL 數(shù)據(jù)庫(kù),監(jiān)聽(tīng)端口為 3306,數(shù)據(jù)庫(kù)名稱(chēng)為psm。username和password:指定連接數(shù)據(jù)庫(kù)所需的用戶(hù)名和密碼。
接下來(lái),我們配置了 Spring Boot 內(nèi)置的 HikariCP 連接池相關(guān)的屬性:
minimum-idle:指定連接池中最小空閑連接數(shù)。在示例中,我們?cè)O(shè)置為 5,表示連接池中至少保持 5 個(gè)空閑連接。maximum-pool-size:指定連接池中的最大連接數(shù)。在示例中,我們?cè)O(shè)置為 20,表示連接池中最多可以擁有 20 個(gè)連接。idle-timeout:指定連接的最大空閑時(shí)長(zhǎng),超過(guò)該時(shí)長(zhǎng)的空閑連接將被釋放。在示例中,我們?cè)O(shè)置為 900000 毫秒(15 分鐘)。connection-timeout:指定連接的超時(shí)時(shí)間,即獲取連接的最大等待時(shí)間。connection-test-query:這里可以指定一個(gè)用于測(cè)試連接是否有效的SQL查詢(xún)語(yǔ)句,比如select 1。連接池會(huì)定期執(zhí)行這個(gè)查詢(xún)來(lái)檢測(cè)連接的有效性。
1、測(cè)試一下
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {
@Autowired
private DataSource dataSource;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
log.info("連接對(duì)象:" + connection);
}
}這是一個(gè)簡(jiǎn)單的Junit測(cè)試類(lèi),用來(lái)驗(yàn)證你在Spring Boot應(yīng)用中配置數(shù)據(jù)源連接池是否成功。以下是這個(gè)測(cè)試類(lèi)的詳細(xì)說(shuō)明:
@Slf4j注解:這個(gè)注解會(huì)自動(dòng)生成一個(gè)名為log的日志對(duì)象,用來(lái)輸出日志信息。@SpringBootTest注解:這個(gè)注解告訴JUnit測(cè)試框架,需要加載整個(gè)Spring應(yīng)用上下文來(lái)執(zhí)行測(cè)試。@Autowired注解:這個(gè)注解用來(lái)自動(dòng)裝配數(shù)據(jù)源連接池對(duì)象,也就是在Spring容器中查找一個(gè)數(shù)據(jù)源對(duì)象并將其注入到dataSource變量中。contextLoads()方法:這個(gè)方法是一個(gè)測(cè)試用例,用來(lái)測(cè)試數(shù)據(jù)源連接池是否正常工作。在這個(gè)方法中,你調(diào)用了dataSource.getConnection()方法獲取一個(gè)數(shù)據(jù)庫(kù)連接,并使用log.info()方法輸出這個(gè)連接對(duì)象。
當(dāng)你運(yùn)行這個(gè)測(cè)試類(lèi)時(shí),如果能夠正常輸出連接對(duì)象,就說(shuō)明你已經(jīng)成功地配置了數(shù)據(jù)源連接池,并且能夠使用它來(lái)管理數(shù)據(jù)庫(kù)連接了。
運(yùn)行結(jié)果:

三、使用 yml 配置 druid 連接池
# 數(shù)據(jù)源連接池
spring:
datasource:
# 連接屬性
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/psm
username: root
password: 123456
# 使用 druid 連接池
druid:
# 最大連接數(shù)
max-active: 100
# 初始化連接數(shù)
initial-size: 10
# 最小連接池?cái)?shù)
min-idle: 10
# 最大等待時(shí)間
max-wait: 1000
# 如果連接空閑時(shí)間大于等于( min-evictable-idle-time-millis)
# 的時(shí)長(zhǎng)則關(guān)閉連接
time-between-eviction-runs-millis: 60000
# 連接保持空閑而不被驅(qū)逐出連接池
min-evictable-idle-time-millis: 300000
# 檢查連接有效性
validation-query: select 1
# 是否緩存 preparedStatement (MySQL 建議關(guān)閉)
pool-prepared-statements: false
以下是一些重要的設(shè)置說(shuō)明:
driver-class-name、url、username和password:這些屬性指定了數(shù)據(jù)庫(kù)連接的基本信息,包括驅(qū)動(dòng)類(lèi)名、數(shù)據(jù)庫(kù)URL、用戶(hù)名和密碼。druid.max-active:這個(gè)屬性指定了連接池中允許的最大活動(dòng)連接數(shù),即最大連接池大小。druid.initial-size:這個(gè)屬性指定了連接池的初始大小,即在連接池剛剛創(chuàng)建時(shí),連接池中包含的連接數(shù)。druid.min-idle:這個(gè)屬性指定了連接池中保持的最小空閑連接數(shù)。druid.max-wait:當(dāng)連接池中沒(méi)有可用連接時(shí),客戶(hù)端在等待連接時(shí)最長(zhǎng)的時(shí)間,單位為毫秒。druid.time-between-eviction-runs-millis:用于檢測(cè)連接池中空閑連接的時(shí)間間隔,單位為毫秒。如果連接空閑時(shí)間大于等于min-evictable-idle-time-millis的時(shí)長(zhǎng),則關(guān)閉連接。druid.min-evictable-idle-time-millis:連接保持空閑而不被驅(qū)逐出連接池的時(shí)長(zhǎng),單位為毫秒。druid.validation-query:用來(lái)檢測(cè)連接是否有效的SQL查詢(xún)語(yǔ)句,例如select 1。druid.pool-prepared-statements:是否緩存prepared statements,對(duì)于MySQL數(shù)據(jù)庫(kù),建議將此屬性設(shè)置為false。
1、測(cè)試一下
@Slf4j
@SpringBootTest
class Ch04ApplicationTests {
@Autowired
private DataSource dataSource;
/**
* 注入 JDBC 的 Template,用于操作數(shù)據(jù)
*/
@Autowired
private JdbcTemplate template;
@Test
void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
log.info("連接對(duì)象:" + connection);
}
@Test
public void testJdbcTemplate(){
List<Map<String, Object>> list = template.queryForList("select * from psm.city_info limit 0,10");
list.forEach(map -> map.forEach((k,v) -> {
log.info("鍵:" + k +" " + "值:" + v);
}) );
}
}這段代碼是一個(gè)Spring Boot的測(cè)試類(lèi),用于測(cè)試數(shù)據(jù)源和JdbcTemplate是否能夠正常工作。
首先,在@Autowired注解下,DataSource對(duì)象被注入到測(cè)試類(lèi)中。這個(gè)數(shù)據(jù)源對(duì)象可以用來(lái)獲取數(shù)據(jù)庫(kù)連接,在contextLoads方法中,通過(guò)調(diào)用dataSource.getConnection()方法獲得了一個(gè)數(shù)據(jù)庫(kù)連接對(duì)象,然后在日志中記錄了這個(gè)連接對(duì)象。
另外,在testJdbcTemplate方法中,可以看到JdbcTemplate對(duì)象也被注入到測(cè)試類(lèi)中。JdbcTemplate是Spring框架提供的一個(gè)用于簡(jiǎn)化JDBC操作的工具類(lèi),可以用它來(lái)執(zhí)行SQL查詢(xún)、更新等操作。在這個(gè)方法中,使用了template.queryForList方法查詢(xún)了psm.city_info表的前10行數(shù)據(jù),并打印出了每一行數(shù)據(jù)中的鍵值對(duì)。
通過(guò)這些測(cè)試,可以驗(yàn)證數(shù)據(jù)源和JdbcTemplate是否已經(jīng)正確配置和注入到Spring容器中,以及它們是否能夠正常地連接和操作數(shù)據(jù)庫(kù)。如果測(cè)試通過(guò),則說(shuō)明你已經(jīng)成功地配置了數(shù)據(jù)源和JdbcTemplate,并能夠使用它們來(lái)操作數(shù)據(jù)庫(kù)。
運(yùn)行結(jié)果:

四、hikari 和Druid的區(qū)別
Hikari和Druid都是Java語(yǔ)言中常用的數(shù)據(jù)庫(kù)連接池。它們之間的不同主要體現(xiàn)在以下幾個(gè)方面:
性能和效率: HikariCP通常被認(rèn)為是性能最好的連接池之一,因?yàn)樗鼘?zhuān)注于快速、輕量級(jí)和高效的連接管理。相比之下,Druid雖然功能強(qiáng)大,但在某些情況下可能會(huì)犧牲一些性能以換取更多的特性和功能。
配置和簡(jiǎn)潔性: HikariCP的配置相對(duì)簡(jiǎn)單,通常只需要很少的參數(shù)設(shè)置就可以工作良好。而Druid提供了更多的配置選項(xiàng)和功能,這使得它在一些復(fù)雜的場(chǎng)景下更具靈活性,但也增加了學(xué)習(xí)和配置的復(fù)雜性。
監(jiān)控和擴(kuò)展性: Druid內(nèi)置了豐富的監(jiān)控和統(tǒng)計(jì)功能,可以方便地查看連接池的狀態(tài)和性能指標(biāo)。此外,Druid還提供了諸如防火墻、SQL轉(zhuǎn)義等額外的功能,這些功能在HikariCP中可能需要額外的集成或擴(kuò)展。
綜上所述,HikariCP適合那些追求高性能、簡(jiǎn)潔配置的場(chǎng)景,而Druid則適合那些對(duì)監(jiān)控和擴(kuò)展性有較高要求的場(chǎng)景。選擇哪個(gè)連接池取決于具體的項(xiàng)目需求和性能考量。
到此這篇關(guān)于SpringBoot 整合數(shù)據(jù)源的具體實(shí)踐的文章就介紹到這了,更多相關(guān)SpringBoot 整合數(shù)據(jù)源內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot Redis配置多數(shù)據(jù)源的項(xiàng)目實(shí)踐
- SpringBoot多數(shù)據(jù)源配置方式以及報(bào)錯(cuò)問(wèn)題的解決
- SpringBoot中配置雙數(shù)據(jù)源的實(shí)現(xiàn)示例
- SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途
- SpringBoot開(kāi)發(fā)中的數(shù)據(jù)源詳解
- springboot添加多數(shù)據(jù)源的方法實(shí)例教程
- 詳解SpringBoot Mybatis如何對(duì)接多數(shù)據(jù)源
- springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
- SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源
- SpringBoot集成Mybatis實(shí)現(xiàn)對(duì)多數(shù)據(jù)源訪(fǎng)問(wèn)原理
相關(guān)文章
詳解springboot使用異步注解@Async獲取執(zhí)行結(jié)果的坑
本文主要介紹了springboot使用異步注解@Async獲取執(zhí)行結(jié)果的坑,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
MybatisPlus整合Flowable出現(xiàn)的坑及解決
這篇文章主要介紹了MybatisPlus整合Flowable出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
SpringBoot2 參數(shù)管理實(shí)踐之入?yún)⒊鰠⑴c校驗(yàn)的方式
這篇文章主要介紹了SpringBoot2 參數(shù)管理實(shí)踐,入?yún)⒊鰠⑴c校驗(yàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-06-06
Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Spring?Boot使用線(xiàn)程池處理上萬(wàn)條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線(xiàn)程池處理上萬(wàn)條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個(gè)線(xiàn)程池的配置,讓Spring Boot加載,用來(lái)定義如何創(chuàng)建一個(gè)ThreadPoolTaskExecutor,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08
SpringBoot簡(jiǎn)單的SpringBoot后端實(shí)例
這篇文章主要介紹了SpringBoot簡(jiǎn)單的SpringBoot后端實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

