SpringBoot?整合數(shù)據(jù)源的具體實(shí)踐
前言
Spring Boot 是當(dāng)今最流行的 Java 開發(fā)框架之一,它以簡潔、高效的特點(diǎn)幫助開發(fā)者快速構(gòu)建穩(wěn)健的應(yīng)用程序。在實(shí)際項(xiàng)目中,涉及到數(shù)據(jù)庫操作的需求時(shí),我們需要對(duì)數(shù)據(jù)源進(jìn)行整合。本文將重點(diǎn)介紹如何在 Spring Boot 中整合數(shù)據(jù)源,以及如何利用 Spring Boot 的便利特性來簡化這一過程。
無論是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,還是當(dāng)下流行的 NoSQL 數(shù)據(jù)庫,Spring Boot 都提供了豐富的支持。通過本文的學(xué)習(xí),讀者將能夠掌握在 Spring Boot 中整合各類數(shù)據(jù)源的方法,并且了解如何利用 Spring Boot 的自動(dòng)配置和簡化的注解來簡化數(shù)據(jù)源配置工作,從而更專注于應(yīng)用程序的業(yè)務(wù)邏輯開發(fā)。
如果你對(duì) Spring Boot 中數(shù)據(jù)源整合的方法感到困惑,或者希望了解如何通過 Spring Boot 來更高效地處理數(shù)據(jù)庫操作,那么本文將為你提供寶貴的指導(dǎo)和實(shí)用的技巧。讓我們一起深入探索 Spring Boot 中數(shù)據(jù)源整合的精彩世界吧!
一、前期準(zhǔn)備
1、新建項(xiàng)目,結(jié)構(gòu)如下
2、導(dǎo)入依賴
<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 依賴配置和構(gòu)建插件示例。這些依賴項(xiàng)將幫助你在項(xiàng)目中使用 Spring Boot 和相關(guān)的數(shù)據(jù)庫連接池進(jìn)行數(shù)據(jù)源整合。以下是示例中包含的依賴項(xiàng)和插件說明:
spring-boot-starter
:Spring Boot 的核心依賴,提供了基本的 Spring Boot 功能。spring-boot-starter-jdbc
:Spring Boot 的 JDBC Starter,用于支持 JDBC 數(shù)據(jù)庫操作。lombok
:Java 開發(fā)工具,簡化了代碼編寫過程。druid-spring-boot-starter
:Druid 連接池的 Spring Boot Starter,用于管理數(shù)據(jù)庫連接。mysql-connector-j
:MySQL 數(shù)據(jù)庫的 JDBC 驅(qū)動(dòng)。spring-boot-starter-test
:Spring Boot 的測試 Starter,用于編寫單元測試。
在構(gòu)建部分,示例使用了 spring-boot-maven-plugin
插件來配置 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í)長 idle-timeout: 900000 # 連接的超時(shí)時(shí)間 connection-timeout: 3000 # 檢查連接的有效性 connection-test-query: select 1
driver-class-name
:指定 JDBC 驅(qū)動(dòng)類的完整類名,用于連接數(shù)據(jù)庫。在示例中,我們使用了 MySQL 的驅(qū)動(dòng)類com.mysql.cj.jdbc.Driver
。url
:指定數(shù)據(jù)庫的連接 URL。在示例中,我們連接的是本地的 MySQL 數(shù)據(jù)庫,監(jiān)聽端口為 3306,數(shù)據(jù)庫名稱為psm
。username
和password
:指定連接數(shù)據(jù)庫所需的用戶名和密碼。
接下來,我們配置了 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í)長,超過該時(shí)長的空閑連接將被釋放。在示例中,我們?cè)O(shè)置為 900000 毫秒(15 分鐘)。connection-timeout
:指定連接的超時(shí)時(shí)間,即獲取連接的最大等待時(shí)間。connection-test-query
:這里可以指定一個(gè)用于測試連接是否有效的SQL查詢語句,比如select 1
。連接池會(huì)定期執(zhí)行這個(gè)查詢來檢測連接的有效性。
1、測試一下
@Slf4j @SpringBootTest class Ch04ApplicationTests { @Autowired private DataSource dataSource; @Test void contextLoads() throws SQLException { Connection connection = dataSource.getConnection(); log.info("連接對(duì)象:" + connection); } }
這是一個(gè)簡單的Junit測試類,用來驗(yàn)證你在Spring Boot應(yīng)用中配置數(shù)據(jù)源連接池是否成功。以下是這個(gè)測試類的詳細(xì)說明:
@Slf4j
注解:這個(gè)注解會(huì)自動(dòng)生成一個(gè)名為log的日志對(duì)象,用來輸出日志信息。@SpringBootTest
注解:這個(gè)注解告訴JUnit測試框架,需要加載整個(gè)Spring應(yīng)用上下文來執(zhí)行測試。@Autowired
注解:這個(gè)注解用來自動(dòng)裝配數(shù)據(jù)源連接池對(duì)象,也就是在Spring容器中查找一個(gè)數(shù)據(jù)源對(duì)象并將其注入到dataSource變量中。contextLoads()
方法:這個(gè)方法是一個(gè)測試用例,用來測試數(shù)據(jù)源連接池是否正常工作。在這個(gè)方法中,你調(diào)用了dataSource.getConnection()
方法獲取一個(gè)數(shù)據(jù)庫連接,并使用log.info()
方法輸出這個(gè)連接對(duì)象。
當(dāng)你運(yùn)行這個(gè)測試類時(shí),如果能夠正常輸出連接對(duì)象,就說明你已經(jīng)成功地配置了數(shù)據(jù)源連接池,并且能夠使用它來管理數(shù)據(jù)庫連接了。
運(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í)長則關(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è)置說明:
driver-class-name
、url
、username
和password
:這些屬性指定了數(shù)據(jù)庫連接的基本信息,包括驅(qū)動(dòng)類名、數(shù)據(jù)庫URL、用戶名和密碼。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)連接池中沒有可用連接時(shí),客戶端在等待連接時(shí)最長的時(shí)間,單位為毫秒。druid.time-between-eviction-runs-millis
:用于檢測連接池中空閑連接的時(shí)間間隔,單位為毫秒。如果連接空閑時(shí)間大于等于min-evictable-idle-time-millis
的時(shí)長,則關(guān)閉連接。druid.min-evictable-idle-time-millis
:連接保持空閑而不被驅(qū)逐出連接池的時(shí)長,單位為毫秒。druid.validation-query
:用來檢測連接是否有效的SQL查詢語句,例如select 1
。druid.pool-prepared-statements
:是否緩存prepared statements,對(duì)于MySQL數(shù)據(jù)庫,建議將此屬性設(shè)置為false。
1、測試一下
@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的測試類,用于測試數(shù)據(jù)源和JdbcTemplate是否能夠正常工作。
首先,在@Autowired
注解下,DataSource
對(duì)象被注入到測試類中。這個(gè)數(shù)據(jù)源對(duì)象可以用來獲取數(shù)據(jù)庫連接,在contextLoads
方法中,通過調(diào)用dataSource.getConnection()
方法獲得了一個(gè)數(shù)據(jù)庫連接對(duì)象,然后在日志中記錄了這個(gè)連接對(duì)象。
另外,在testJdbcTemplate
方法中,可以看到JdbcTemplate
對(duì)象也被注入到測試類中。JdbcTemplate
是Spring框架提供的一個(gè)用于簡化JDBC操作的工具類,可以用它來執(zhí)行SQL查詢、更新等操作。在這個(gè)方法中,使用了template.queryForList
方法查詢了psm.city_info
表的前10行數(shù)據(jù),并打印出了每一行數(shù)據(jù)中的鍵值對(duì)。
通過這些測試,可以驗(yàn)證數(shù)據(jù)源和JdbcTemplate是否已經(jīng)正確配置和注入到Spring容器中,以及它們是否能夠正常地連接和操作數(shù)據(jù)庫。如果測試通過,則說明你已經(jīng)成功地配置了數(shù)據(jù)源和JdbcTemplate,并能夠使用它們來操作數(shù)據(jù)庫。
運(yùn)行結(jié)果:
四、hikari 和Druid的區(qū)別
Hikari和Druid都是Java語言中常用的數(shù)據(jù)庫連接池。它們之間的不同主要體現(xiàn)在以下幾個(gè)方面:
性能和效率: HikariCP通常被認(rèn)為是性能最好的連接池之一,因?yàn)樗鼘W⒂诳焖佟⑤p量級(jí)和高效的連接管理。相比之下,Druid雖然功能強(qiáng)大,但在某些情況下可能會(huì)犧牲一些性能以換取更多的特性和功能。
配置和簡潔性: HikariCP的配置相對(duì)簡單,通常只需要很少的參數(shù)設(shè)置就可以工作良好。而Druid提供了更多的配置選項(xiàng)和功能,這使得它在一些復(fù)雜的場景下更具靈活性,但也增加了學(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適合那些追求高性能、簡潔配置的場景,而Druid則適合那些對(duì)監(jiān)控和擴(kuò)展性有較高要求的場景。選擇哪個(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ò)問題的解決
- SpringBoot中配置雙數(shù)據(jù)源的實(shí)現(xiàn)示例
- SpringBoot中動(dòng)態(tài)數(shù)據(jù)源是實(shí)現(xiàn)與用途
- SpringBoot開發(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ù)源訪問原理
相關(guān)文章
詳解springboot使用異步注解@Async獲取執(zhí)行結(jié)果的坑
本文主要介紹了springboot使用異步注解@Async獲取執(zhí)行結(jié)果的坑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08MybatisPlus整合Flowable出現(xiàn)的坑及解決
這篇文章主要介紹了MybatisPlus整合Flowable出現(xiàn)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03SpringBoot2 參數(shù)管理實(shí)踐之入?yún)⒊鰠⑴c校驗(yàn)的方式
這篇文章主要介紹了SpringBoot2 參數(shù)管理實(shí)踐,入?yún)⒊鰠⑴c校驗(yàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-06-06Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法
這篇文章主要介紹了Java Swing JCheckBox復(fù)選框的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能
這篇文章主要介紹了Spring?Boot使用線程池處理上萬條數(shù)據(jù)插入功能,使用步驟是先創(chuàng)建一個(gè)線程池的配置,讓Spring Boot加載,用來定義如何創(chuàng)建一個(gè)ThreadPoolTaskExecutor,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-08-08SpringBoot簡單的SpringBoot后端實(shí)例
這篇文章主要介紹了SpringBoot簡單的SpringBoot后端實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03