欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot配置默認(rèn)HikariCP數(shù)據(jù)源

 更新時間:2023年11月01日 15:12:47   作者:Miaow.Y.Hu  
咱們開發(fā)項(xiàng)目的過程中用到很多的開源數(shù)據(jù)庫鏈接池,比如druid、c3p0、BoneCP等等,本文主要介紹了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 錯誤頁面處理的方法

    本篇文章主要介紹了spring boot下 500 404 錯誤頁面處理的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn)

    IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn)

    本文主要介紹了IDEA修改生成jar包名字的兩種方法實(shí)現(xiàn),通過簡單的步驟,您可以修改項(xiàng)目名稱并在打包時使用新的名稱,具有一定的參考價值,感興趣的可以了解下
    2023-08-08
  • springboot自定義redis-starter的實(shí)現(xiàn)

    springboot自定義redis-starter的實(shí)現(xiàn)

    這篇文章主要介紹了springboot自定義redis-starter的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • java實(shí)現(xiàn)汽車租賃系統(tǒng)

    java實(shí)現(xiàn)汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺談Thread.sleep()為什么要拋出中斷異常

    淺談Thread.sleep()為什么要拋出中斷異常

    本文主要介紹了淺談Thread.sleep()為什么要拋出中斷異常,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 如何在Java中使用標(biāo)準(zhǔn)庫創(chuàng)建臨時文件

    如何在Java中使用標(biāo)準(zhǔn)庫創(chuàng)建臨時文件

    有時候我們程序運(yùn)行時需要產(chǎn)生中間文件,但是這些文件只是臨時用途,并不做長久保存,我們可以使用臨時文件,不需要長久保存,這篇文章主要給大家介紹了關(guān)于如何在Java中使用標(biāo)準(zhǔn)庫創(chuàng)建臨時文件的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Java?延時隊(duì)列及簡單使用方式詳解

    Java?延時隊(duì)列及簡單使用方式詳解

    這篇文章主要介紹了Java延時隊(duì)列簡單使用方式,通過本文學(xué)習(xí)知道延時隊(duì)列是什么可以用來干什么,本文通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • Springboot引入攔截器并放行swagger代碼實(shí)例

    Springboot引入攔截器并放行swagger代碼實(shí)例

    這篇文章主要介紹了Springboot引入攔截器并放行swagger代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11
  • 在logback.xml中自定義動態(tài)屬性的方法

    在logback.xml中自定義動態(tài)屬性的方法

    這篇文章主要介紹了在logback.xml中自定義動態(tài)屬性的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 簡單了解synchronized和lock的區(qū)別

    簡單了解synchronized和lock的區(qū)別

    這篇文章主要介紹了簡單了解synchronized和lock的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09

最新評論