SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源
在了解HiKari之前,我們需要先了解關(guān)于數(shù)據(jù)訪問的相關(guān)概念:
什么是JDBC
JDBC(Java Database Connectivity)是Java編程語言用于與數(shù)據(jù)庫進(jìn)行交互的標(biāo)準(zhǔn)API。它提供了一組類和接口,用于執(zhí)行數(shù)據(jù)庫操作,如連接到數(shù)據(jù)庫、執(zhí)行SQL語句、處理查詢結(jié)果等。
JDBC允許開發(fā)人員使用Java代碼與不同的關(guān)系型數(shù)據(jù)庫進(jìn)行通信,無論是MySQL、Oracle、SQL Server還是其他支持JDBC的數(shù)據(jù)庫系統(tǒng)。
通過JDBC,開發(fā)人員可以使用標(biāo)準(zhǔn)的Java語法和面向?qū)ο蟮姆绞絹韴?zhí)行數(shù)據(jù)庫操作。它提供了一種獨(dú)立于特定數(shù)據(jù)庫的通用方式來訪問和操作數(shù)據(jù)庫,使得應(yīng)用程序可以輕松地切換和兼容不同的數(shù)據(jù)庫系統(tǒng)。
JDBC的核心組件包括DriverManager、Connection、Statement和ResultSet等。
DriverManager用于管理數(shù)據(jù)庫驅(qū)動程序,Connection用于建立與數(shù)據(jù)庫的連接,Statement用于執(zhí)行SQL語句,ResultSet用于處理查詢結(jié)果。
通過JDBC,開發(fā)人員可以使用Java語言編寫數(shù)據(jù)庫應(yīng)用程序,執(zhí)行各種數(shù)據(jù)庫操作,如插入、更新、刪除數(shù)據(jù),以及查詢和處理查詢結(jié)果。這使得開發(fā)人員能夠輕松地將數(shù)據(jù)庫集成到他們的應(yīng)用程序中,并與數(shù)據(jù)庫進(jìn)行交互。
什么是數(shù)據(jù)源
數(shù)據(jù)源(Data Source)是指數(shù)據(jù)庫或其他數(shù)據(jù)存儲系統(tǒng)的物理或邏輯位置,它提供了訪問和操作數(shù)據(jù)的接口。數(shù)據(jù)源可以是關(guān)系型數(shù)據(jù)庫、文件系統(tǒng)、內(nèi)存數(shù)據(jù)庫、消息隊(duì)列等。
在軟件開發(fā)中,數(shù)據(jù)源通常用于連接和管理數(shù)據(jù)存儲系統(tǒng),并提供數(shù)據(jù)的讀取、寫入和查詢功能。它是應(yīng)用程序與數(shù)據(jù)存儲系統(tǒng)之間的中間層,隱藏了底層數(shù)據(jù)存儲系統(tǒng)的細(xì)節(jié),使得應(yīng)用程序可以以統(tǒng)一的方式訪問不同類型的數(shù)據(jù)。
使用數(shù)據(jù)源可以提供以下好處:
抽象化:數(shù)據(jù)源提供了一個抽象層,使得應(yīng)用程序可以以統(tǒng)一的方式訪問各種數(shù)據(jù)存儲系統(tǒng),無需關(guān)心底層細(xì)節(jié)。
連接管理:數(shù)據(jù)源負(fù)責(zé)管理與數(shù)據(jù)存儲系統(tǒng)之間的連接,包括連接的創(chuàng)建、釋放和連接池管理,提供了高效的連接管理機(jī)制。
事務(wù)管理:數(shù)據(jù)源可以支持事務(wù)管理,確保數(shù)據(jù)操作的一致性和完整性
查詢優(yōu)化:數(shù)據(jù)源可以對查詢進(jìn)行優(yōu)化,提供更高效的數(shù)據(jù)訪問和查詢性能。
在Java中,常見的數(shù)據(jù)源包括JDBC數(shù)據(jù)源、連接池?cái)?shù)據(jù)源(如HikariCP、Apache Commons DBCP)、JNDI數(shù)據(jù)源等。這些數(shù)據(jù)源可以通過配置文件或代碼來配置和使用,以便應(yīng)用程序可以連接和操作數(shù)據(jù)庫。
HikariCP
HikariCP是一個高性能的JDBC(Java數(shù)據(jù)庫連接)連接池庫,用于管理數(shù)據(jù)庫連接的分配和釋放。它旨在提供快速、輕量級和可伸縮的數(shù)據(jù)庫連接池,特別適用于Java應(yīng)用程序,如Spring Boot應(yīng)用程序。
HikariCP的主要特點(diǎn)包括:
- 高性能: HikariCP的設(shè)計(jì)目標(biāo)之一是提供卓越的性能。它通過減少連接池本身的開銷、優(yōu)化線程池的管理以及有效地處理數(shù)據(jù)庫連接的分配和釋放來實(shí)現(xiàn)高性能。
- 輕量級: HikariCP是一個輕量級的庫,它的jar文件非常小,不會占用太多內(nèi)存。這對于資源受限的應(yīng)用程序來說是一個重要的優(yōu)勢。
- 自動管理連接: HikariCP能夠自動管理數(shù)據(jù)庫連接,包括連接的創(chuàng)建、驗(yàn)證、分配和釋放。它可以有效地處理連接的閑置和超時,以確保連接池中始終有可用的連接。
- 配置靈活: HikariCP允許你通過配置屬性來調(diào)整連接池的行為,以滿足不同應(yīng)用程序的需求。你可以輕松地配置連接超時、最大連接數(shù)、最小空閑連接數(shù)等參數(shù)。
- 支持監(jiān)控: HikariCP提供了監(jiān)控連接池的功能,可以用于跟蹤連接池的性能和狀態(tài)。這對于應(yīng)用程序的性能分析和故障排查非常有用。
HikariCP在Java生態(tài)系統(tǒng)中得到廣泛使用,特別是在Spring Boot應(yīng)用程序中,因?yàn)樗cSpring Boot集成得很好,并且能夠提供可靠的數(shù)據(jù)庫連接池管理。通過使用HikariCP,你可以更好地管理和優(yōu)化數(shù)據(jù)庫連接,從而提高應(yīng)用程序的性能和可伸縮性。
在Spring Boot中配置默認(rèn)數(shù)據(jù)源HikariCp
在Spring Boot自動化配置中,對于數(shù)據(jù)源的配置可以分為兩類:
通用配置:以spring.datasource.*
的形式存在,主要是對一些即使使用不同數(shù)據(jù)源也都需要配置的一些常規(guī)內(nèi)容。比如:數(shù)據(jù)庫鏈接地址、用戶名、密碼等。這里就不做過多說明了,通常就這些配置:
# MySQL #spring.datasource.url=jdbc:mysql://localhost:3306/test #spring.datasource.username=root #spring.datasource.password= #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Oracle spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
數(shù)據(jù)源連接池配置:以spring.datasource.<數(shù)據(jù)源名稱>.*
的形式存在,比如:Hikari的配置參數(shù)就是spring.datasource.hikari.*
形式。下面這個是我們最常用的幾個配置項(xiàng)及對應(yīng)說明:
# 最小空閑連接,默認(rèn)值10,小于0或大于maximum-pool-size,都會重置為maximum-pool-size spring.datasource.hikari.minimum-idle=10 # 最大連接數(shù),小于等于0會被重置為默認(rèn)值10;大于零小于1會被重置為minimum-idle的值 spring.datasource.hikari.maximum-pool-size=20 # 空閑連接超時時間,默認(rèn)值600000(10分鐘),大于等于max-lifetime且max-lifetime>0,會被重置為0;不等于0且小于10秒,會被重置為10秒。 spring.datasource.hikari.idle-timeout=500000 # 連接最大存活時間.不等于0且小于30秒,會被重置為默認(rèn)值30分鐘.設(shè)置應(yīng)該比mysql設(shè)置的超時時間短 spring.datasource.hikari.max-lifetime=540000 # 連接超時時間:毫秒,小于250毫秒,否則被重置為默認(rèn)值30秒 spring.datasource.hikari.connection-timeout=60000 # 用于測試連接是否可用的查詢語句 spring.datasource.hikari.connection-test-query=SELECT 1 from useradd
更多相關(guān)配置請參照
spring.datasource.hikari.connectionTimeout
: 連接超時時間(毫秒)。連接池在嘗試獲取連接時等待的最長時間。
spring.datasource.hikari.maximumPoolSize
: 連接池的最大連接數(shù)。連接池將嘗試維護(hù)的最大活動連接數(shù)。
spring.datasource.hikari.minimumIdle
: 連接池的最小空閑連接數(shù)。連接池會嘗試保持的最小空閑連接數(shù)。
spring.datasource.hikari.idleTimeout
: 連接的最大空閑時間(毫秒)。超過此時間的空閑連接將被關(guān)閉并從池中刪除。
spring.datasource.hikari.maxLifetime
: 連接的最大生存時間(毫秒)。連接在連接池中的最長壽命。一旦達(dá)到此時間,連接將被關(guān)閉并從池中刪除。
spring.datasource.hikari.connectionTestQuery
: 用于測試連接的SQL查詢語句。當(dāng)從連接池中獲取連接時,連接池將執(zhí)行此查詢以確保連接的有效性。
spring.datasource.hikari.poolName
: 連接池的名稱。用于標(biāo)識連接池的名稱。
spring.datasource.hikari.dataSourceClassName
: 數(shù)據(jù)源的完整類名。用于指定JDBC驅(qū)動程序的類。
spring.datasource.hikari.username
: 數(shù)據(jù)庫用戶名。
spring.datasource.hikari.password
: 數(shù)據(jù)庫密碼。
spring.datasource.hikari.autoCommit
: 是否自動提交事務(wù),默認(rèn)為true。
spring.datasource.hikari.transactionIsolation
: 數(shù)據(jù)庫連接的事務(wù)隔離級別??梢栽O(shè)置為 “DEFAULT”、“TRANSACTION_READ_UNCOMMITTED”、“TRANSACTION_READ_COMMITTED”、“TRANSACTION_REPEATABLE_READ”、“TRANSACTION_SERIALIZABLE” 等值。
spring.datasource.hikari.initializationFailTimeout
: 連接池初始化失敗時的超時時間(毫秒)。如果連接池初始化失敗,將等待此時間。
spring.datasource.hikari.isolateInternalQueries
: 是否隔離內(nèi)部查詢。默認(rèn)為false。
spring.datasource.hikari.allowPoolSuspension
: 是否允許連接池暫停。默認(rèn)為false。
這些配置項(xiàng)可以在application.properties或application.yml文件中進(jìn)行設(shè)置,根據(jù)你的應(yīng)用程序的需求,可以調(diào)整這些配置項(xiàng)以獲得最佳性能和可靠性。
demo
給出我在測試階段的相關(guān)代碼:
第一步在Spring Boot中引入相關(guān)依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
第二步,在application.properties配置相關(guān)依賴:
#spring.datasource.url=jdbc:mysql://localhost:3306/test #spring.datasource.username=root #spring.datasource.password= #spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver # 最小空閑連接,默認(rèn)值10,小于0或大于maximum-pool-size,都會重置為maximum-pool-size spring.datasource.hikari.minimum-idle=10 # 最大連接數(shù),小于等于0會被重置為默認(rèn)值10;大于零小于1會被重置為minimum-idle的值 spring.datasource.hikari.maximum-pool-size=20 # 空閑連接超時時間,默認(rèn)值600000(10分鐘),大于等于max-lifetime且max-lifetime>0,會被重置為0;不等于0且小于10秒,會被重置為10秒。 spring.datasource.hikari.idle-timeout=500000 # 連接最大存活時間.不等于0且小于30秒,會被重置為默認(rèn)值30分鐘.設(shè)置應(yīng)該比mysql設(shè)置的超時時間短 spring.datasource.hikari.max-lifetime=540000 # 連接超時時間:毫秒,小于250毫秒,否則被重置為默認(rèn)值30秒 spring.datasource.hikari.connection-timeout=60000 # 用于測試連接是否可用的查詢語句 spring.datasource.hikari.connection-test-query=SELECT 1 from useradd
第三步,設(shè)計(jì)數(shù)據(jù)庫:
PS: 我采用的是Oracle 數(shù)據(jù)庫,語法與MySQL有所差別
CREATE TABLE useradd ( name varchar2 (100) NOT NULL, age integer NOT NULL )
第四步,創(chuàng)建對應(yīng)的實(shí)體類對象:
public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public User(String name, Integer age) { this.name = name; this.age = age; } public User() { } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return name.equals(user.name) && age.equals(user.age); } @Override public int hashCode() { return Objects.hash(name, age); } }
第五步,設(shè)計(jì)相關(guān)接口信息:
public interface UserService { /** * 新增一個用戶 * * @param name * @param age */ int create(String name, Integer age); /** * 根據(jù)name查詢用戶 * * @param name * @return */ List<User> getByName(String name); /** * 根據(jù)name刪除用戶 * * @param name */ int deleteByName(String name); /** * 獲取用戶總量 */ int getAllUsers(); /** * 刪除所有用戶 */ int deleteAllUsers(); }
第六步,設(shè)計(jì)接口實(shí)現(xiàn)類:
@Service public class UserServiceImpl implements UserService { private JdbcTemplate jdbcTemplate; UserServiceImpl(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public int create(String name, Integer age) { return jdbcTemplate.update("insert into USERADD(NAME, AGE) values(?, ?)", name, age); } @Override public List<User> getByName(String name) { List<User> users = jdbcTemplate.query("select NAME, AGE from USERADD where NAME = ?", (resultSet, i) -> { User user = new User(); user.setName(resultSet.getString("NAME")); user.setAge(resultSet.getInt("AGE")); return user; }, name); return users; } @Override public int deleteByName(String name) { return jdbcTemplate.update("delete from USERADD where NAME = ?", name); } @Override public int getAllUsers() { return jdbcTemplate.queryForObject("select count(1) from USERADD", Integer.class); } @Override public int deleteAllUsers() { return jdbcTemplate.update("delete from USERADD"); } }
第七步,我們通過設(shè)計(jì)單元測試進(jìn)行測試:
@Slf4j @RunWith(SpringRunner.class) @SpringBootTest public class Chapter32ApplicationTests { @Autowired private UserService userSerivce; @Autowired private DataSource dataSource; @Before public void setUp() { // 準(zhǔn)備,清空user表 userSerivce.deleteAllUsers(); } @Test public void test() throws Exception { // 插入5個用戶 userSerivce.create("Tom", 10); userSerivce.create("Mike", 11); userSerivce.create("Didispace", 30); userSerivce.create("Oscar", 21); userSerivce.create("Linda", 17); // 查詢名為Oscar的用戶,判斷年齡是否匹配 List<User> userList = userSerivce.getByName("Oscar"); Assert.assertEquals(21, userList.get(0).getAge().intValue()); // 查數(shù)據(jù)庫,應(yīng)該有5個用戶 Assert.assertEquals(5, userSerivce.getAllUsers()); // 刪除兩個用戶 userSerivce.deleteByName("Tom"); userSerivce.deleteByName("Mike"); // 查數(shù)據(jù)庫,應(yīng)該有5個用戶 Assert.assertEquals(3, userSerivce.getAllUsers()); } }
到此這篇關(guān)于SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源的文章就介紹到這了,更多相關(guān)SpringBoot配置HikariCP數(shù)據(jù)源內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot下 500 404 錯誤頁面處理的方法
本篇文章主要介紹了spring boot下 500 404 錯誤頁面處理的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn)
本文主要介紹了IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn),通過簡單的步驟,您可以修改項(xiàng)目名稱并在打包時使用新的名稱,具有一定的參考價值,感興趣的可以了解下2023-08-08springboot自定義redis-starter的實(shí)現(xiàn)
這篇文章主要介紹了springboot自定義redis-starter的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10如何在Java中使用標(biāo)準(zhǔn)庫創(chuàng)建臨時文件
有時候我們程序運(yùn)行時需要產(chǎn)生中間文件,但是這些文件只是臨時用途,并不做長久保存,我們可以使用臨時文件,不需要長久保存,這篇文章主要給大家介紹了關(guān)于如何在Java中使用標(biāo)準(zhǔn)庫創(chuàng)建臨時文件的相關(guān)資料,需要的朋友可以參考下2023-10-10Springboot引入攔截器并放行swagger代碼實(shí)例
這篇文章主要介紹了Springboot引入攔截器并放行swagger代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11