最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot + KingbaseES 連接池的實現(xiàn)步驟

 更新時間:2026年04月16日 09:08:24   作者:篤行其道  
本文介紹了SpringBoot+KingbaseES環(huán)境中如何選擇和配置合適的數據庫連接池,對比了DBCP、C3P0、Druid和HikariCP四大主流連接池的特點和配置方式,感興趣的可以了解一下

一、前言

在企業(yè)項目開發(fā)過程中,我們經常同時關注進度和性能:頁面需要快速響應,接口需要穩(wěn)定,但數據庫連接管理這個隱蔽而關鍵的部分往往被忽略。高峰期如果沒有預先建立連接,應用就像高鐵只剩一條候車通道一樣會堵塞。因此,連接池這種“預先建立通道與閘門”的機制成為了性能優(yōu)化的基礎要件。

近年來,國產數據庫KingBaseES在醫(yī)療、交通等安全性和法規(guī)要求極高的領域應用越來越廣泛。許多團隊在從Oracle、PostgreSQL遷移到KingBaseES后,首先面臨的問題就是如何選擇合適的連接池。 DBCP老將軍溫和可靠,C3P0歷史悠久注重可伸縮性,Druid監(jiān)控功能豐富且實用,HikariCP以極致輕盈見長。本文將結合Spring Boot真實開發(fā)場景,分享這四大數據庫連接池的配置思路、特點及優(yōu)化要領,助您少走彎路。

二、數據庫連接池的作用是什么?

簡而言之,數據庫連接池的原理就像提前準備好一桶水放在家里,而不是每次渴了再跑到井邊打水一樣。新建和釋放數據庫連接本身就是一項耗時的系統(tǒng)開銷過程:握手、鑒權、資源分配等步驟都不能省略。如果每個HTTP請求獨立建立和斷開連接,勢必給數據庫帶來很大壓力。 系統(tǒng)資源在處理重復任務時很容易出現(xiàn)消耗,這對系統(tǒng)的響應能力和通過量都有不利影響。連接池的作用是:在低峰時期預先創(chuàng)建一定數量的可用連接,形成連接的“池”;在高峰期根據業(yè)務波動動態(tài)增加或者縮減連接數量;請求來時從“池”中取出連接使用,用完后再放回“池”中;同時對“池”中的連接進行監(jiān)測,失效的連接予以重新建立。這樣既可以保證系統(tǒng)性能的穩(wěn)定性,也可以通過統(tǒng)計數據了解系統(tǒng)和業(yè)務的變化規(guī)律,為后期優(yōu)化提供參考。

三、SpringBoot + KingbaseES 環(huán)境準備

三步心智模型:

  1. 加依賴(讓項目知道怎么連庫)
  2. 填地址(告訴它去哪里、用誰登錄)
  3. 驗連通(啟動時或寫個最小 SQL 探活)

3.1 加依賴(pom.xml)

最少必備 = JDBC + 驅動 + 選一個連接池(別全塞上,沖突或白占空間)。

<dependencies>
    <!-- Spring JDBC 基礎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <!-- KingbaseES 驅動(版本鎖定,跟服務器一致) -->
    <dependency>
        <groupId>com.kingbase8</groupId>
        <artifactId>kingbase8</artifactId>
        <version>8.6.0</version>
    </dependency>
    <!-- 連接池:三選一(推薦 Hikari 或 Druid) -->
    <!-- Druid(生產監(jiān)控友好) -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.2.18</version>
    </dependency>
    <!-- 或 Apache DBCP2(老系統(tǒng)遷移) -->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
    </dependency>
    <!-- 或 HikariCP(高性能 / Spring Boot 默認) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>
</dependencies>

提示: 如果用 Spring Boot Starter,很多情況下不必單獨引 HikariCP,它已內嵌。

3.2 基礎連接信息(application.yml)

一定核對四件套:地址 / 端口 / 庫名 / 賬號密碼 + 驅動類名。

kingbase:
  driver-class-name: com.kingbase8.Driver
  url: jdbc:kingbase8://127.0.0.1:54321/TEST
  username: SYSTEM
  password: SYSTEM

小建議:
生產別寫死密碼 → 用環(huán)境變量或外部化配置(如:ENC、K8S Secret)
若多數據源,分前綴管理,別混在 spring.datasource 根層

四、四類主流連接池實戰(zhàn)

DBCP: 老黃牛,穩(wěn)但不花哨。
C3P0: 功能多,參數細,適合“歷史復雜場景”兜底。
Druid: 自帶監(jiān)控 + SQL 防火墻,運維愛。
HikariCP: 快、輕、現(xiàn)代、高并發(fā)友好。

4.1 DBCP(遷移型 / 傳統(tǒng)項目友好)

看點:initial-size / max-total / validation-query 三核心。

SpringBoot配置方式

@Configuration
public class DbcpDataSourceConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.dbcp")
    public DataSource dbcpDataSource() {
        return new BasicDataSource();
    }
}

application.yml配置

spring:
  datasource:
    dbcp:
      driver-class-name: com.kingbase8.Driver
      url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: MANAGER
      initial-size: 5
      max-total: 50
      min-idle: 5
      max-idle: 20
      validation-query: SELECT 'x'
      test-on-borrow: true
      test-while-idle: true
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000

實際應用示例

@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<User> findAllUsers() {
        return jdbcTemplate.query(
            "SELECT id, name, email FROM users",
            (rs, i) -> {
                User u = new User();
                u.setId(rs.getLong("id"));
                u.setName(rs.getString("name"));
                u.setEmail(rs.getString("email"));
                return u;
            }
        );
    }
}

4.2 C3P0

核心參數:
acquireIncrement:不夠時一次加多少
idleConnectionTestPeriod:健康巡檢周期(秒)
preferredTestQuery:輕量探活

SpringBoot配置方式

@Bean
public DataSource c3p0DataSource() throws PropertyVetoException {
    ComboPooledDataSource ds = new ComboPooledDataSource();
    ds.setDriverClass("com.kingbase8.Driver");
    ds.setJdbcUrl("jdbc:kingbase8://127.0.0.1:54321/TEST");
    ds.setUser("SYSTEM");
    ds.setPassword("SYSTEM");
    ds.setInitialPoolSize(5);
    ds.setMinPoolSize(5);
    ds.setMaxPoolSize(50);
    ds.setAcquireIncrement(3);
    ds.setIdleConnectionTestPeriod(10);
    ds.setPreferredTestQuery("SELECT 1");
    ds.setMaxIdleTime(1800);
    return ds;
}

注意: 巡檢太頻繁(如 <5s)會浪費資源;查詢語句盡量輕。

4.3 Druid(生產推薦 + 可視化)

優(yōu)點:SQL 監(jiān)控、慢 SQL、Wall 防注入、Web 控制臺一站式。

application.yml配置

spring:
  datasource:
    druid:
      driver-class-name: com.kingbase8.Driver
      url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: MANAGER
      initial-size: 5
      max-active: 50
      min-idle: 5
      max-wait: 60000
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000
      validation-query: SELECT 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      filters: stat,wall,log4j2
      web-stat-filter:
        enabled: true
        url-pattern: /*
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
        reset-enable: false
        login-username: admin
        login-password: admin123

SpringBoot配置方式

@Configuration
public class DruidConfig {
    @Bean
    @ConfigurationProperties("spring.datasource.druid")
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
        ServletRegistrationBean<StatViewServlet> bean =
            new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        bean.addInitParameter("loginUsername", "admin");
        bean.addInitParameter("loginPassword", "admin123");
        bean.addInitParameter("resetEnable", "false");
        return bean;
    }
}

控制臺路徑:/druid/index.html
賬號密碼務必生產自定義 + 限制 IP

4.4 HikariCP(SpringBoot默認 / 高性能首選)

特點:啟動快、延遲低、參數少、容錯好。

application.yml配置

spring:
  datasource:
    hikari:
      driver-class-name: com.kingbase8.Driver
      jdbc-url: jdbc:kingbase8://127.0.0.1:54321/TEST
      username: SYSTEM
      password: SYSTEM
      minimum-idle: 5
      maximum-pool-size: 50
      connection-timeout: 10000
      idle-timeout: 600000
      max-lifetime: 1800000
      validation-timeout: 5000
      connection-test-query: SELECT 1
      pool-name: KingbaseHikariCP
      auto-commit: true
      leak-detection-threshold: 60000

SpringBoot配置方式

@Configuration
public class HikariTunedConfig {
    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.hikari")
    public HikariDataSource hikariDataSource() {
        HikariDataSource ds = new HikariDataSource();
        ds.addDataSourceProperty("cachePrepStmts", "true");
        ds.addDataSourceProperty("prepStmtCacheSize", "250");
        ds.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
        ds.addDataSourceProperty("useServerPrepStmts", "true");
        return ds;
    }
}

五、遇到的問題

監(jiān)控缺失,問題發(fā)現(xiàn)太晚

這個不算技術問題,但影響很嚴重。
事故現(xiàn)場: 系統(tǒng)慢慢變慢,用戶體驗越來越差,但開發(fā)團隊渾然不覺,直到老板親自體驗后發(fā)飆才知道出了問題。
問題根源: 沒有配置合適的監(jiān)控和告警機制,連接池的狀態(tài)變化、慢SQL的增加、連接獲取時間的延長,這些關鍵指標都沒有被監(jiān)控到。
解決方案: 建立完善的監(jiān)控體系:

@Component
public class ConnectionPoolMonitor {
    private static final Logger logger = LoggerFactory.getLogger(ConnectionPoolMonitor.class);
    @Autowired
    private DataSource dataSource;
    @Scheduled(fixedRate = 60000) // 每分鐘檢查一次
    public void monitorConnectionPool() {
        if (dataSource instanceof HikariDataSource) {
            HikariDataSource hikariDS = (HikariDataSource) dataSource;
            HikariPoolMXBean poolMXBean = hikariDS.getHikariPoolMXBean();
            int activeConnections = poolMXBean.getActiveConnections();
            int idleConnections = poolMXBean.getIdleConnections();
            int totalConnections = poolMXBean.getTotalConnections();
            int threadsAwaitingConnection = poolMXBean.getThreadsAwaitingConnection();
            logger.info("連接池狀態(tài) - 活躍:{}, 空閑:{}, 總計:{}, 等待:{}", 
                activeConnections, idleConnections, totalConnections, threadsAwaitingConnection);
            // 告警邏輯
            if (activeConnections > totalConnections * 0.8) {
                logger.warn("連接池使用率過高!活躍連接:{}, 總連接:{}", activeConnections, totalConnections);
                // 發(fā)送告警通知...
            }
            if (threadsAwaitingConnection > 0) {
                logger.error("有線程在等待連接!等待數量:{}", threadsAwaitingConnection);
                // 發(fā)送緊急告警...
            }
        }
    }
}

經驗教訓:

監(jiān)控不是可有可無的,是必需品
關鍵指標要設置閾值告警,不要等到出問題才發(fā)現(xiàn)
Druid的監(jiān)控頁面雖然好用,但不能替代程序化的監(jiān)控和告警

配置參數"拍腦袋",性能反而變差

這個案例,是關于盲目調優(yōu)的。
事故現(xiàn)場: 看到網上說HikariCP性能最好,就把所有參數都調到"最優(yōu)"值,結果系統(tǒng)性能不升反降。
問題根源: 網上的"最佳實踐"不一定適合自己的場景。比如,把連接數調得很大,但實際業(yè)務并發(fā)量不高,反而增加了資源浪費;把超時時間調得很短,導致正常的長查詢也被中斷。

盲目"優(yōu)化"的配置
spring:
  datasource:
    hikari:
      maximum-pool-size: 200  # 太大了,浪費資源
      connection-timeout: 1000  # 太短了,正常查詢都超時
      idle-timeout: 60000  # 太短了,連接頻繁創(chuàng)建銷毀
      max-lifetime: 300000  # 太短了,增加了不必要的開銷

正確做法: 根據實際業(yè)務場景,逐步調優(yōu):

@Component
public class ConnectionPoolTuning {
    public void performanceTuning() {
        // 1. 先測試默認配置的性能基線
        // 2. 分析業(yè)務特點:并發(fā)量、查詢復雜度、事務長度
        // 3. 逐個參數調整,每次只改一個參數
        // 4. 壓測驗證效果
        // 5. 記錄最優(yōu)配置
        System.out.println("調優(yōu)原則:");
        System.out.println("1. 連接數 = CPU核心數 * 2 + 磁盤數(起始值)");
        System.out.println("2. 超時時間要大于最長查詢時間");
        System.out.println("3. 空閑超時要平衡資源利用和連接創(chuàng)建開銷");
        System.out.println("4. 生命周期要小于數據庫連接超時");
    }
}

經驗教訓:
不要盲目相信"最佳實踐",要結合自己的實際情況
調優(yōu)是個漸進的過程,不要一次改太多參數
每次調整都要有數據支撐,不要憑感覺
記錄調優(yōu)過程和結果,方便后續(xù)參考

五、總結

如果把數據庫訪問比喻成在辦公室飲水:不要隨時隨地都去打井取水(建立臨時連接),而是提前準備好整齊的水杯(連接池)備用。

在 Spring Boot + KingbaseES 中,HikariCP 就像高性能新式飲水機,是首選的連接池實現(xiàn);

Druid 相比之下更像帶有大屏幕監(jiān)控功能的智能型水壺,可以監(jiān)視水量和過濾雜質,更適合需要可視化監(jiān)控和審計的團隊;

相比之下,DBCP 和 C3P0 更像傳統(tǒng)型水壺,如果歷史原因無法升級,暫時可以繼續(xù)使用,但不再推薦投入資源進行升級。

真正的優(yōu)化不在于簡單地準備越多的水杯,而是需要事先研究高峰期人流量和平均消耗時間,精準設計水杯數以確保不虛不漏;同時關注慢查詢和長時占用連接的情況,及時清理“牽掛不放”的水杯。簡而言之:首先選擇優(yōu)秀的連接池實現(xiàn)(推薦 HikariCP),如果需要可視化,可以考慮 Druid;然后進行詳細規(guī)劃、持續(xù)監(jiān)測指標和優(yōu)化,這樣系統(tǒng)既可靠又高效。

到此這篇關于Spring Boot + KingbaseES 連接池的實現(xiàn)步驟的文章就介紹到這了,更多相關Spring Boot KingbaseES 連接池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mybatis中流式查詢的實現(xiàn)示例

    Mybatis中流式查詢的實現(xiàn)示例

    MyBatis的ResultHandler是用于處理數據庫查詢結果集的工具,可以通過回調函數對數據進行流式處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09
  • Java字符串與正則表達式操作方法詳解

    Java字符串與正則表達式操作方法詳解

    在Java編程中正則表達式是一個強大的工具,用于處理字符串和進行模式匹配,這篇文章主要介紹了Java字符串與正則表達式操作的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • ElasticSearch?深度分頁示例解析

    ElasticSearch?深度分頁示例解析

    這篇文章主要為大家介紹了ElasticSearch?深度分頁示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Java多線程Runable售票系統(tǒng)實現(xiàn)過程解析

    Java多線程Runable售票系統(tǒng)實現(xiàn)過程解析

    這篇文章主要介紹了Java多線程Runable售票系統(tǒng)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • Spring?Boot?整合JPA?數據模型關聯(lián)使用操作(一對一、一對多、多對多)

    Spring?Boot?整合JPA?數據模型關聯(lián)使用操作(一對一、一對多、多對多)

    這篇文章主要介紹了Spring?Boot?整合JPA?數據模型關聯(lián)操作(一對一、一對多、多對多),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • SpringBoot?LocalDateTime格式轉換方案詳解(前端入參)

    SpringBoot?LocalDateTime格式轉換方案詳解(前端入參)

    這篇文章主要介紹了SpringBoot?LocalDateTime格式轉換(前端入參),本文用示例介紹SpringBoot全局格式配置,將前端傳過來的時間自動轉化為LocalDateTime,需要的朋友可以參考下
    2023-04-04
  • 詳解Java volatile 內存屏障底層原理語義

    詳解Java volatile 內存屏障底層原理語義

    為了保證內存可見性,java 編譯器在生成指令序列的適當位置會插入內存屏障指令來禁止特定類型的處理器重排序。為了實現(xiàn) volatile 內存語義,JMM 會分別限制這兩種類型的重排序類型
    2021-09-09
  • Java中Calendar日期類常用方法演示

    Java中Calendar日期類常用方法演示

    這篇文章主要給大家介紹了關于Java中Calendar日期類用法詳細介紹的相關資料,Calendar類是?Java?中用于處理日期和時間的抽象類,它提供了一種獨立于特定日歷系統(tǒng)的方式來處理日期和時間,需要的朋友可以參考下
    2023-12-12
  • Java 數據結構與算法系列精講之時間復雜度與空間復雜度

    Java 數據結構與算法系列精講之時間復雜度與空間復雜度

    對于一個算法,其時間復雜度和空間復雜度往往是相互影響的,當追求一個較好的時間復雜度時,可能會使空間復雜度的性能變差,即可能導致占用較多的存儲空間,這篇文章主要給大家介紹了關于Java時間復雜度、空間復雜度的相關資料,需要的朋友可以參考下
    2022-02-02
  • Java如何接收XML格式參數并轉換為JSON

    Java如何接收XML格式參數并轉換為JSON

    在 Java 應用程序中,處理 XML 數據并將其轉換為 JSON 格式是很常見的任務,這篇文章為大家整理了一下具體的實現(xiàn)方法,希望對大家有所幫助
    2025-03-03

最新評論

大宁县| 天水市| 增城市| 阳信县| 阳信县| 灵璧县| 灵璧县| 河北区| 米脂县| 武汉市| 子洲县| 永春县| 澄城县| 扶风县| 开江县| 毕节市| 滕州市| 清丰县| 称多县| 凌海市| 天镇县| 邵阳县| 东乡族自治县| 泌阳县| 德保县| 万安县| 衡南县| 类乌齐县| 乐至县| 华宁县| 英超| 伊金霍洛旗| 乌海市| 清原| 周口市| 眉山市| 滨海县| 延庆县| 宜宾市| 安国市| 隆尧县|